用条件计数行

时间:2013-07-06 19:26:27

标签: sql sql-server tsql

我的表格如下所示

Id | Customer_number | Customer_Name | Customer_owner

我想将Customer_Number作为特定于Customer_owner

的序列插入

是1,2,3,....对于Customer_owner X和1,2,3,... Customer_owner Y。

要获取Customer_number,我可以使用以下SQL

SELECT COUNT(*) FROM Customer where Customer_owner='X'

我的问题是,是否有任何性能影响。特别适用于具有100,000条记录的表。 还有更好的选择吗?

3 个答案:

答案 0 :(得分:1)

就性能而言,出于各种原因,我建议不向客户添加其他列

  1. 在向所有者A添加客户时,需要更新所有业主的A相关客户,同样需要删除。

  2. 客户端数量多次重复 - 占用更多空间,从而(通常)减慢执行速度。

  3. 没有实际用途可以通过另一列将客户端数量链接到客户所有者,以获取描述单个客户的记录。

  4. 以及更多解释..

    正确的普通表格将包含2个表格:

    1. 客户(CUST_ID,CUST_NAME,Cust_Owner_id)
    2. 2.A。所有者(Owner_id,Owner_name,NumberOfCustomers)

      OR

      2.b中。拥有者(Owner_id,Owner_name)并在查询时自动计算NumberOfCustomers。

      修改 由于您希望显示单个所有者的所有客户,我认为这是您的主要用途,您应该在Cust_Owner_id 上添加群集索引。然后,在查询时,性能会很好,因为它可以根据您所需的数据进行聚类。

      在此处详细了解群集: Clustered Index

      编辑2:

      我刚刚通过最新评论意识到了您的意图,但我仍然会提出解决方案,特别针对您的问题,我不建议您应该存储所有一位所有者客户的号码,而是保留在Customers表中 SUBSCRIBED DATE列,并在查询时,确定显示的客户编号。 但是,如果您希望该数字是永久性的(由于订单1,2,3,... n可能会中断,因为客户可以被删除),只需使用Customer_Id,因为它已经是唯一的。

答案 1 :(得分:1)

您可以在需要时随时计算Customer_Number

select c.*, row_number() over (partition by Customer_Owner order by id) as CustomerNumber
from Customer c

这比尝试存储和维护数字更安全,这可能会受到系统中各种更新的影响。例如,想象一下当现有记录改变其所有权时更改编号的乐趣。

答案 2 :(得分:0)

如果您只需要在UI中使用唯一编号,则只需在UI中指定编号即可。如果你走这条路线,你需要确保你总是以相同的顺序检索客户,所以添加一个ORDER BY Id,或者做Gordon Linoff所建议的。