2017-04-12 150 views
0

我试图将计数小于5的所有活动(针对数据共享原因)进行分组。SQL在case语句中使用count

身份证号码和身份证号码给了我很高的号码,但只要我包含“商店代码”,我就会为一些或两次前往奇数店铺的客户收到一些低级号码。

Select Count(*) [Activity], 
     T.[ID Code], 
     T.[ID Name], 
     Case when Count(*) < 6 then 'Other Shop' Else T.Shop End [Shop Code] 
From MyTable T 
Group By T.[ID Code], 
     T.[ID Name], 
     Case when Count(*) < 6 then 'Other Shop' Else T.Shop End 

但显然我不能在case语句中使用count。我已经尝试了类似问题的一些解决方案,但他们都没有工作!

由于

+0

case expression,not statement。 – jarlh

回答

1

的问题是GROUP BY

Select Count(*) as [Activity], 
     T.[ID Code], 
     T.[ID Name], 
     (Case when Count(*) < 6 then 'Other Shop' Else T.Shop 
     End) as [Shop Code] 
From MyTable T 
Group By T.[ID Code], 
     T.[ID Name]; 

集合函数(或表达与聚集体)不会在GROUP BY属于。这些是计算的中的SELECT,不用于定义组。

0

您可以使用HAVINGUNION ALL声明,就像这样:

Select Count(*) as [Activity], 
    T.[ID Code], 
    T.[ID Name], 
    'Other Shop' [Shop Code] 
From MyTable T 
Group By T.[ID Code], 
     T.[ID Name] 
having Count(*) < 6 
union all 
Select Count(*) as [Activity], 
    T.[ID Code], 
    T.[ID Name], 
    T.Shop [Shop Code] 
From MyTable T 
Group By T.[ID Code], 
     T.[ID Name] 
having Count(*) >= 6 
0
select 
count(*) as activity, 
code, 
name, 
Case when Count(*) < 6 then 'Other Shop' Else shopcode End as shopcode 
from mytable group by code, name ,shopcode 
0

下面的例子是在SQL Server的测试。

它使用窗口函数count来更改商店代码。
然后对其进行分组,包括修改后的shopcode。

declare @ShopTable table ([ID Code] varchar(30), [ID Name] varchar(30), Shop varchar(30)); 

insert into @ShopTable ([ID Code], [ID Name], Shop) values 
('S1','Shop 1','AA'), 
('S1','Shop 1','BB'), 
('S1','Shop 1','BB'), 
('S1','Shop 1','CC'), 
('S1','Shop 1','CC'), 
('S1','Shop 1','CC'), 
('S2','Shop 2','XX'), 
('S2','Shop 2','YY'); 

select 
count(*) as [Activity], 
[ID Code], 
[ID Name], 
[Shop Code] 
from (
    select 
    [ID Code], 
    [ID Name], 
    case when count(*) over (partition by [ID Code], [ID Name]) < 6 then 'Other Shop' else Shop end as [Shop Code] 
    from @ShopTable 
) Q 
group by [ID Code], [ID Name], [Shop Code];