2017-04-12 6 views
0

データの共有の理由から、カウントが5未満のすべてのアクティビティをグループ化しようとしています。case文でcountを使用しているSQL

IDコードとIDネームは私には高いレベルの番号が与えられますが、「ショップコード」を含むとすぐに、私は奇妙なショップに1〜2回行く顧客のためにいくつかの低レベルの番号を取得します。

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 

明らかに、ケースステートメントではカウントを使用できません。私は同様の質問にいくつかのソリューションを試しましたが、どちらもうまくいきませんでした!

おかげ

+0

ケース式、ないステートメント。 – 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のテストです。

これは、カウントのためにウィンドウ関数を使用して、ショップコードを変更します。
そして、その変更された店舗コードを含めてすべてグループ化します。

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];