これを行うには、分析関数ROW_NUMBER
とを使用NTILE
します (RDBMS がそれらをサポートしていると仮定します)。このようにして、使用可能な各営業担当者に 1 から増加する疑似 ID を割り当て、未割り当ての各レコードにこれらの疑似 ID の 1 つをランダムに割り当てて、営業担当者間で均等に割り当てることができます。実際の ID ではなく疑似 ID を使用すると、SalesPersonID
フィールドが連続していなくてもかまいません。例えば
-- CREATE SOME SAMPLE DATA
DECLARE @SalesPerson TABLE (SalesPersonID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, Name VARCHAR(50) NOT NULL, Active BIT NOT NULL)
DECLARE @Record TABLE (RecordID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, SalesPersonFK INT NULL, SomeOtherInfo VARCHAR(100))
INSERT @SalesPerson VALUES ('TEST1', 1), ('TEST2', 0), ('TEST3', 1), ('TEST4', 1);
INSERT @Record (SomeOtherInfo)
SELECT Name
FROM Sys.all_Objects
このサンプル データを使用して、最初のステップは、レコードを割り当てることができる営業担当者の数を見つけることです。
DECLARE @Count INT = (SELECT COUNT(*) FROM @SalesPerson WHERE Active = 1)
次に CTE を使用してウィンドウ関数を含めます (結合句では使用できないため)。
;WITH Records AS
( SELECT *,
NTILE(@Count) OVER(ORDER BY NEWID()) [PseudoSalesPersonID]
FROM @Record
WHERE SalesPersonFK IS NULL -- UNALLOCATED RECORDS
), SalesPeople AS
( SELECT SalesPersonID,
ROW_NUMBER() OVER (ORDER BY SalesPersonID) [RowNumber]
FROM @SalesPerson
WHERE Active = 1 -- ACTIVE SALES PEOPLE
)
最後に、疑似 ID ではなく実際の営業担当者 ID でレコード CTE を更新します。
UPDATE Records
SET SalesPersonFK = SalesPeople.SalesPersonID
FROM Records
INNER JOIN SalesPeople
ON PseudoSalesPersonID = RowNumber
SQL FIDDLE ですべてを組み合わせる