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
我正在使用 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