2015-01-09 64 views
9

對於每個獨特的GroupId我希望得到每個IsGreen,IsRound,IsLoud條件和總行數的計數。計算組內的每個條件

的樣本數據:

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

我用下面的代碼來創建表,我遇到的問題是,如果任何的組中沒有行匹配組未出現在最終表中的條件之一。完成我想要做的事的最佳方式是什麼?

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

如果你改變了所有的內部連接到左外連接您的代碼將正常工作。 – Matt

回答

16

您可以使用count計算每各[GroupId]sum行計數每個屬性。

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

Niceeee回答! –

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