2015-01-09 6 views
9

すべてユニークな場合はIsGreenIsRoundIsLoudの条件と合計行数を取得したいと考えています。グループ内の各条件を数えてください

サンプルデータ:

----------------------------------------------------- 
id | ItemId | GroupId | IsGreen | IsRound | IsLoud 
----+--------+---------+---------+---------+--------- 
    1 | 1001 | 1 | 0 | 1 | 1 
    2 | 1002 | 1 | 1 | 1 | 0 
    3 | 1003 | 2 | 0 | 0 | 0 
    4 | 1004 | 2 | 1 | 0 | 1 
    5 | 1005 | 2 | 0 | 0 | 0 
    6 | 1006 | 3 | 0 | 0 | 0 
    7 | 1007 | 3 | 0 | 0 | 0 

望ましい結果:

---------------------------------------------------------- 
GroupId | TotalRows | TotalGreen | TotalRound | TotalLoud 
--------+-----------+------------+------------+----------- 
    1 |  2  |  1  |  2  |  1 
    2 |  3  |  1  |  0  |  1 
    3 |  2  |  0  |  0  |  0 

私はテーブルを作成するには、次のコードを使用しています、私がいる問題があればということですのグループには、グループが最終テーブルに表示されない条件の1つに一致する行がありません。私がしたいことを達成する最良の方法は何ですか?

SELECT total.GroupId 
    , total.[Count] AS TotalRows 
    , IsGreen.[Count] AS TotalGreen 
    , IsRound.[Count] AS TotalRound 
    , IsLoud.[Count] AS TotalLoud 
FROM (
    SELECT GroupId 
     , count(*) AS [Count] 
    FROM TestData 
    GROUP BY GroupId 
) TotalRows 
INNER JOIN (
    SELECT GroupId 
     , count(*) AS [Count] 
    FROM TestData 
    WHERE IsGreen = 1 
    GROUP BY GroupId 
) IsGreen ON IsGreen.GroupId = TotalRows.GroupId 
INNER JOIN (
    SELECT GroupId 
     , count(*) AS [Count] 
    FROM TestData 
    WHERE IsRound = 1 
    GROUP BY GroupId 
) IsRound ON IsRound.GroupId = TotalRows.GroupId 
INNER JOIN (
    SELECT GroupId 
     , count(*) AS [Count] 
    FROM TestData 
    WHERE IsLoud = 1 
    GROUP BY GroupId 
) IsLoud ON IsLoud.GroupId = TotalRows.GroupId 
+3

は、なぜこれがgroupID'ことにより、簡単な ''グループとcount'と '合計ではありません?' – xQbert

+0

あなたはLEFT外部結合するために、すべての内部結合変更された場合はあなたのコードは正常に動作します。 – Matt

答えて

16

あなたは、各プロパティをカウントするために、各[GroupId]sumごとの行をカウントするcountを使用することができます。

select [GroupId] 
    , count([GroupId]) as [TotalRows] 
    , sum([IsGreen]) as [TotalGreen] 
    , sum([IsRound]) as [TotalRound] 
    , sum([IsLoud]) as [TotalLoud] 
from [TestData] 
group by [GroupId] 
+0

ニースの答え! –

6

conditional Aggregateを使用してください。これを試して。

SELECT GroupId, 
     Count(GroupId) TotalRows, 
     Count(CASE WHEN IsGreen = 1 THEN 1 END) TotalGreen, 
     Count(CASE WHEN IsRound = 1 THEN 1 END) TotalRound, 
     Count(CASE WHEN IsLoud = 1 THEN 1 END) TotalLoud 
FROM tablename 
GROUP BY GroupId 
+2

'case'式これはちょっとこのような状況では余計です。 – potashin

関連する問題