2015-01-09 17 views
9

Đối với mỗi số GroupId duy nhất, tôi muốn nhận được số lượng của mỗi điều kiện IsGreen, IsRound, IsLoud và tổng số hàng.Đếm từng điều kiện trong nhóm

mẫu dữ liệu:

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

mong muốn kết quả:

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

Tôi đang sử dụng đoạn mã sau để tạo bảng, vấn đề tôi đang gặp là nếu bất kỳ của các nhóm không có hàng nào khớp với một trong các điều kiện mà nhóm không xuất hiện trong bảng cuối cùng. Cách tốt nhất để hoàn thành những gì tôi muốn làm là gì?

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

Tại sao không phải là này một đơn giản 'nhóm bởi groupID' và một' count' và 'tổng?' – xQbert

+0

Mã của bạn sẽ hoạt động tốt nếu bạn đã thay đổi tất cả các bên tham gia để LEFT OUTER JOIN. – Matt

Trả lời

16

Bạn có thể sử dụng count để đếm hàng cho mỗi [GroupId]sum đếm từng tài sản.

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 trả lời! –

6

Sử dụng conditional Aggregate. Thử cái này.

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

'trường hợp 'biểu hiện nó kinda thừa trong tình huống này. – potashin

Các vấn đề liên quan