2010-01-29 10 views
8

मैं निम्नलिखित कथन का उपयोग कर रहा हूं और मुझे लगभग हर चीज की आवश्यकता है। इसके अलावा, मैं सभी पंक्तियों के कुल परिणामों का एसयूएम प्राप्त करना चाहता हूं।MySQL - मैं एक क्षेत्र के COUNT के SUM कैसे प्राप्त करूं?

SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
SUM(c.amount) as row_total 
FROM campaigns c 
JOIN campaign_codes cc 
LEFT JOIN partners p on p.id = 4 
WHERE c.partner_id = 4 AND cc.status = 0 AND c.id = cc.campaign_id 
GROUP BY c.id 
ORDER BY campaign_amount ASC 

और यहाँ एक उदाहरण परिणाम है अंतिम स्तंभ स्तंभ मैं एक साथ जोड़ना चाहते हैं होने के साथ:,

SELECT SUM([row_total]) FROM (
Your query 
) Source 

नीचे टिप्पणी से:

1 10.00 30 992 24 9920.00 
    3 25.00 30 995 290 24875.00 
    16 50.00 30 988 335 49400.00 
    17 100.00 30 1000 335 100000.00 
+0

क्या आप डेटा curr दोनों चाहते हैं आपके उदाहरण में * * * अंतिम कॉलम के मानों का योग दर्ज किया गया है? यदि हां: क्या आप केवल एप्लिकेशन परत में मानों को जोड़ नहीं सकते हैं? –

+0

हां, मैं चाहता हूं कि मैं जो डेटा प्रदर्शित करता हूं और अंतिम कॉल के मूल्यों का योग चाहता हूं। मैं इसे नियंत्रक में जोड़ सकता हूं या परत देख सकता हूं, लेकिन सोचा कि यह मॉडल के लिए सबसे उपयुक्त है। – k00k

उत्तर

11

चल योग प्राप्त करने के लिए अतिरिक्त फ़ील्ड:

 SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
       COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
       SUM(c.amount) as row_total, 
       (
       SELECT SUM(c.amount) 
       FROM campaign c, … 
       -- the same but without the GROUP BY and ORDER BY clauses. 
       ) 
     FROM campaign c, … 
     GROUP BY 
       c.id 
     ORDER BY 
       campaign_amount ASC 
+0

+1, यह कुछ उपयोगी चाल है जो आप वहां पहुंचे हैं! –

+0

Quassnoi: यह बहुत चिकना है। और अगर मैं ऑर्डर से बाहर निकलता हूं तो यह अच्छा काम करता है, अन्यथा ऑर्डर द्वारा त्रुटि में फेंकता है: CUBE/रोलअप का गलत उपयोग और – k00k

+0

@ के 00k द्वारा गलत उपयोग: निश्चित रूप से, इसके बारे में भूल गए। बस इसे एक नेस्टेड क्वेरी में लपेटें। मैं पोस्ट अपडेट करूंगा। – Quassnoi

4

को अपनी क्वेरी समाहित आप कोशिश कर सकते हैं ...

Your Query 
UNION ALL 
SELECT '', '', '', '', '', SUM([row_total]) FROM (
Your query 
) Source 

संघ सभी आपको परिणाम सेट में अतिरिक्त पंक्ति जोड़ने की अनुमति देगा जो आपको 'कुल पंक्ति' देगा। आप अपने डेटा प्रकारों से मेल खाने के लिए खाली फ़ील्ड (सिंगल कोट्स) को बदल सकते हैं या उन्हें विशेष मान निर्दिष्ट कर सकते हैं जो आपकी कुल पंक्ति का प्रतिनिधित्व करेंगे।

SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
     COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
     SUM(c.amount) as row_total, @r := @r + SUM(c.amount) AS running_sum 
FROM (
     SELECT @r := 0 
     ) vars, 
     campaign c, … 

महायोग प्राप्त करने के लिए (और अन्य सभी समुच्चय) एक अतिरिक्त रिकॉर्ड के रूप में:

SELECT * 
FROM (
     SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
       COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
       SUM(c.amount) as row_total 
     FROM campaign c, … 
     GROUP BY 
       c.id WITH ROLLUP 
     ) q 
ORDER BY 
     campaign_amount ASC 

एक में कुल योग प्राप्त करने के लिए

+0

ठीक है, लेकिन यह केवल मुझे कुल और अन्य जानकारी भी नहीं देगा, सही? – k00k

+0

आप अन्य जानकारी नहीं रखेंगे, आप सभी जानकारी की कुल इच्छा चाहते हैं, फिर बाकी पंक्तियों को गठबंधन करने का कोई तरीका नहीं है। यदि आप हर पंक्ति का योग प्राप्त करना चाहते हैं, तो बस SUM (पंक्ति) को ऊपर और ऊपर जोड़ें। रुको, क्या आप कुल के लिए एक अलग पंक्ति चाहते हैं? –

+0

हां, मैं परिणाम में अन्य जानकारी भी रखना चाहता हूं। मैं कुल के लिए एक अलग/अतिरिक्त क्षेत्र चाहते हैं। – k00k

1
SELECT TB.campaign_id, TB.campaign_amount, TB.warning_trigger, TB.code_count, TB.days_remain, TB.row_total, SUM(TB.row_total) GlobalTotal FROM (SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
SUM(c.amount) as row_total 
FROM campaigns c 
JOIN campaign_codes cc 
LEFT JOIN partners p on p.id = 4 
WHERE c.partner_id = 4 AND cc.status = 0 AND c.id = cc.campaign_id 
GROUP BY c.id 
ORDER BY campaign_amount ASC) TB 
GROUP BY TB.campaign_id, TB.campaign_amount, TB.warning_trigger, TB.code_count, TB.days_remain, TB.row_total 
+0

@ टुफो: यह केवल मुझे कुल देगा, न कि मेरे सभी उदाहरण परिणामों के साथ-साथ (जो मुझे चाहिए)। – k00k

+0

समझा, आप दोनों के साथ कुछ प्रतिशत करने जा रहे हैं, हुन? मैंने कोड संपादित किया है, इसे आजमाएं – Tufo

+0

जो ग्रुप कॉलम (MIN(), MAX(), COUNT(), ...) के मिश्रण को ग्रुप कॉलम गैरकानूनी है, यदि कोई समूह है तो अवैध है खंड – k00k