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