c# - 销售人员记录

标签 c# sql database database-design

我正在设计这个数据库和 C# 应用程序,记录被保存到数据库中。现在假设我们有三个销售人员,每个人都应该严格轮换分配一个记录,这样他们就可以处理相同数量的记录。

到目前为止,我所做的是创建一个名为 Records 的表和一个 SalesPerson,该 Records 会将销售人员 id 作为外键和另一列会说明它分配给哪个代理并将增加此列。

你认为这是一个好的设计,如果不是,你能给点意见吗?

最佳答案

为此,我将使用分析函数 ROW_NUMBERNTILE(假设您的 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

ALL COMBINED IN AN SQL FIDDLE

关于c# - 销售人员记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511092/

相关文章:

java - 在 Java Derby 中创建包含值的表

c# - 一个简单数据库的初学者问题

sql - 查找共享特定评论的所有记录

java - 前端有很多按钮的表格数据插入删除代码怎么写?

c# - 使用客户端凭证流持久化 token 的最佳实践

c# - 如何在MVVM中组合异步和非异步服务?

mysql - 使用 id 对数据进行分组并从第一行和最后一行获取数据

php - Codeigniter $this->db->get(),我如何返回特定行的值?

c# - 类型参数的构造函数签名约束

c# - 这个并行异步调用可以简化吗?