2010-05-26 11 views
21

मेरे पास एक खाता तालिका और एक रिकॉर्ड तालिका है जहां खातों में एकाधिक रिकॉर्ड हैं। मैं "रिकॉर्ड्स की गिनती" रेंज द्वारा खाता कुल को तोड़ना चाहता हूं। अर्थात।MySQL और CASE जब मानों की एक श्रृंखला

Count of Records | Count 
========================= 
0-25 | 100 
25 - 50 | 122 
50 - 100 | 300 

का टूटना आदि

मैं निम्न क्वेरी का उपयोग कर रहा दिखाएं, लेकिन मैं "जीआरपी" है जो मैं क्या चाहते हैं, सबसे अच्छा तरीका पर किसी भी मदद से समूह में नहीं मिल सकता है क्वेरी संशोधित करें?

SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id 
    ORDER BY ct 

उत्तर

19

इस प्रयास करें:

SELECT count(*) as ct, 
CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' 
END AS grp 
FROM records r, accounts a 
WHERE r.account_id=a.id 
GROUP BY r.account_id, a.id, 
    CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' END 
ORDER BY count(*) 

आप आप में मूल डेटा पंक्तियों तरह इकट्ठा करना चाहते हैं "को परिभाषित करने के लिए" "बकेट" है ... यह वही समूह खंड तक के लिए है .. यह मानदंडों को परिभाषित करता है जिसके आधार पर बेस टेबल में प्रत्येक पंक्ति का विश्लेषण किया जाएगा, यह निर्धारित करने के लिए कि "बाल्टी" का डेटा किस प्रकार एकत्र किया जाएगा ... समूह द्वारा परिभाषित अभिव्यक्ति या अभिव्यक्ति उन बाल्टीओं के लिए "परिभाषाएं" हैं।

चूंकि क्वेरी मूल डेटा पंक्तियों को संसाधित करती है, इसलिए कोई भी पंक्ति जिसके लिए इस अभिव्यक्ति का मान मौजूदा बाल्टी के समान होता है, उस बाल्टी में समेकित होता है ... किसी भी नई पंक्ति के साथ कोई मान नहीं एक मौजूदा बाल्टी द्वारा प्रतिनिधित्व एक नई बाल्टी बनने का कारण बनता है ...

+2

मैं त्रुटि 1111 (HY000): समूह समारोह का अमान्य उपयोग मैं mysql 5.1 धन्यवाद उपयोग कर रहा हूँ! – kickdaddy

+0

क्षमा करें, क्योंकि आप एसक्यूएल क्वेरी के मुख्य भाग में 'r.Account_id' और 'a.id' कॉलम का उपयोग कर रहे हैं, आपको समूह में उन लोगों को भी शामिल करना होगा ... प्रत्येक स्तंभ या अभिव्यक्ति को t9o निर्दिष्ट किया गया है क्वेरी के मुख्य (प्री-एग्रीगेशन) भाग में जो एक समेकन फ़ंक्शन (योग, औसत, न्यूनतम, अधिकतम इत्यादि) नहीं है, समूह में खंड द्वारा उल्लेख किया जाना चाहिए। –

+0

मुझे नहीं लगता कि आप ग्रुप बाय क्लॉज के अंदर COUNT (*) का उपयोग कैसे कर सकते हैं। क्या यह भी संभव है? –

6

आपको एक उप-प्रश्न की आवश्यकता है। यदि यह एक दृश्य है तो आपको दो विचारों का उपयोग करने की आवश्यकता है।

SELECT s.ct, s.grp FROM ( 
SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 AND COUNT(*) < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 AND COUNT(*) < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 AND COUNT(*) < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 AND COUNT(*) < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 AND COUNT(*) < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id) as s 

Group BY s.grp; 
संबंधित मुद्दे