2015-01-09 18 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

आप प्रत्येक संपत्ति गिनती करने के लिए प्रत्येक [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

'केस' अभिव्यक्ति इस स्थिति में थोड़ी सी अनिवार्य है। – potashin