2015-06-01 172 views
0

我正在使用SQL Server 2012.我有一个表CustomerMaster。下面是一些示例内容:SQL Server 2012计数

+--------+---------------+-----------------+-------------+ 
| 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列,其客户总数属于某个组。

请分享你的想法如何做到这一点。

谢谢......

回答

1

这是我想出了

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解决方案在行动中看到的查询。

但我不同意你的数据结构。你应该有一个单独的表为你的组。在客户表中,您只需引用组表中的组的ID。这使得所有内容(包括上面的查询)变得更清洁。

+0

非常感谢它的工作... –

+0

是的我知道你的意思,但它更容易有一个表中的所有数据迁移目的。这些不是活的数据库内容。这些是DM目的所需的数据。谢谢大家的支持。 –

0

如果我理解正确,可以使用窗口函数进行更新。下面是可更新的CTE的例子:

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

谢谢戈登,但它也计算组记录。我想要的是属于不包括组记录的组的成员数量。有什么建议么? –

+0

@Devinda。 。 。你能减1吗? –

+0

嗨戈登,不,我没有尝试减1,我会尽力让你知道男人。许多thanx为您的支持,欢呼声;-) –

0

您可能没有选择这样做,但我会将组分离到自己的表中。

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

然后,NewMainCustNo更改为群ID,创建,清除组的客户表,并从那里走。然后,得到一个组数将是:

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