我正在设计这个数据库和 C# 应用程序,记录被保存到数据库中。现在假设我们有三个销售人员,每个人都应该严格轮换分配一个记录,这样他们就可以处理相同数量的记录。
到目前为止,我所做的是创建一个名为 Records
的表和一个 SalesPerson
,该 Records 会将销售人员 id
作为外键和另一列会说明它分配给哪个代理并将增加此列。
你认为这是一个好的设计,如果不是,你能给点意见吗?
最佳答案
为此,我将使用分析函数 ROW_NUMBER
和 NTILE
(假设您的 RDBMS 支持它们)。通过这种方式,您可以为每个可用的销售人员分配一个从 1 向上递增的伪 ID,然后为每个未分配的记录随机分配这些伪 ID 之一,以便在销售人员之间平均分配它们。使用伪 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
关于c# - 销售人员记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511092/