2011-01-11 13 views
5

मैं निम्नलिखित सरल प्रश्न हैं,कहाँ कुल कार्यों पर खंड हालत

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO) as Issues 
FROM ISSUES I JOIN USERS U ON I.IS_ASSIGNED_USER_ID = U.US_USER_ID 
WHERE I.IS_RECEIVED_DATETIME BETWEEN 20110101000000 AND 20110107000000 
GROUP BY U.US_LOGON_NAME; 

मैं कहाँ) कार्यों का चयन करें सूची में अतिरिक्त COUNT (जोड़ते हैं, लेकिन कुछ थोपना चाहता हूँ जहाँ उन पर स्थिति। क्या यह किसी भी तरह से CASE() कथन के साथ किया गया है? मैंने चुनिंदा सूची के अंदर क्लॉज कहां डालने की कोशिश की, और ऐसा प्रतीत नहीं होता है। मुझे यकीन नहीं है कि उपकुंजी वास्तव में यहां जरूरी हैं, लेकिन मुझे ऐसा नहीं लगता है।

उदाहरण के लिए मैं एक COUNT() फ़ंक्शन कि केवल एक निश्चित सीमा के भीतर मुद्दों में गिना जाता है, तो एक और एक और रेंज में या अन्य मिश्रित शर्तों के साथ चाहते हैं, आदि:

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO (condition here) 
COUNT(I.IS_ISSUE_NO (a different condition here) 

आदि ...

अभी भी लॉगऑन नाम द्वारा समूहीकृत।

धन्यवाद।

उत्तर

10
SELECT 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND1 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND2 
+0

'COUNT' भी गिनती नहीं करता है' 0'? मैंने सोचा कि केवल 'न्यूल' की गणना नहीं की गई थी। –

+1

@ किर्क वोल: यह अपने उत्तर में COUNT कहां कहता है? –

+0

हां, लेकिन एडम COUNTing नहीं है, वह SUMming है। –

4

कुछ समाधान।

आप इस तथ्य का लाभ ले सकते है कि SQL शून्य मान शामिल नहीं किये जाते:

SELECT US_LOGON_NAME as Username, 
    COUNT(CASE WHEN <cond>  THEN I.IS_ISSUE_NO ELSE NULL END) 
    COUNT(CASE WHEN <other cond> THEN I.IS_ISSUE_NO ELSE NULL END) 
    . . . 

या आप COUNT के बजाय योग का उपयोग कर सकते हैं:

SELECT US_LOGON_NAME as Username, 
    SUM(CASE WHEN <cond>  THEN 1 ELSE 0 END) 
    SUM(CASE WHEN <other cond> THEN 1 ELSE 0 END) 
    . . . 

या तो मामले में, आप के रूप में दोहरा सकते हैं आपको जितनी बार जरूरत है उतनी बार।

+1

मुझे लगता है कि आपके 'केस' अभिव्यक्ति शायद अमान्य वाक्यविन्यास हैं क्योंकि कोई 'अंत' नहीं है। –

+0

मुझे लगता है कि आप सही हैं, महोदय। मैंने अभी सिंटैक्स अपडेट किया है। भागना बंद करना चाहिए। –

0

उदाहरण प्रति उपयोगकर्ता गिनती प्रति IssueType पर निर्भर करता है।

; 
with 
q_00 as (
select 
     is_issue_no 
    , is_assigned_user_id 
    , case 
      when is_issue_no between 1 and 10 then 'A' 
      when is_issue_no between 11 and 14 then 'B' 
      else 'C' 
     end as IssueType 
from Issues 
) 
select 
     us_logon_name 
    , IssueType 
    , count(1) as cnt 
from q_00 as a 
join users as u on a.is_assigned_user_id = u.us_user_id 
group by us_logon_name, IssueType 
order by us_logon_name, IssueType ; 

एसक्यूएल सर्वर 2005 +

संबंधित मुद्दे