SQL 服务器 2012 计数

SQL Server 2012 Count

我正在使用 SQL Server 2012。我有 table CustomerMaster。以下是一些示例内容:

+--------+---------------+-----------------+-------------+
| CustNo | NewMainCustNo | Longname        | NoOfMembers |
+--------+---------------+-----------------+-------------+
| 3653   | 3653          | GroupId:003     |             |
| 3654   | 3654          | GroupId:004     |             |
| 11     | 3653          | Peter Evans     |             |
| 155    | 3653          | Harold Charley  |             |
| 156    | 3654          | David Arnold    |             |
| 160    | 3653          | Mickey Willson  |             |
| 2861   | 3653          | Jonathan Wickey |             |
| 2871   | 3653          | William Jason   |             |
+--------+---------------+-----------------+-------------+

客户记录的 NewMainCustNo 等同于集团记录的 CustNo。基本上每个客户都属于一个特定的组。

我的问题是如何使用属于某个组的客户总数更新组记录的 NoOfMembers 列。

请分享您的想法。

谢谢...

如果我没理解错的话,您可以使用window函数进行更新。这是一个带有可更新 CTE 的示例:

with toupdate as (
      select cm.*, count(*) over (partition by NewMainCustNo) as grpcount
      from customermaster
     )
update toupdate
    set NoOfMembers = grpcount;

这是我想出的解决方案

update CustomerMaster 
set NoOfMembers = (select count(*) from CustomerMaster m2 where m2.NewMainCustNo = CustomerMaster.CustNo and m2.CustNo <> CustomerMaster.CustNo) 
where LongName like 'GroupId:%'

检查 this SQL Fiddle 以查看正在运行的查询。

但是我不同意你的数据结构。您应该为您的群组设置一个单独的 table。在你的客户table中你只需要在组table中引用组的ID。这使得一切(包括上面的查询)都更加清晰。

您可能没有这样做的选项,但我会把组分成他们自己的 table。

create table Groups (
        GroupID int primary key,
        Name varchar(200)
    )

然后,将 NewMainCustNo 更改为 GroupID,创建并清除您的客户 table 组,然后从那里开始。然后,获取组数将是:

select  GroupID, 
        Name [Group Name],
        COUNT(*)
    from Groups g
    join Customers c on
        c.GroupID = g.GroupID