मैं तीन टेबल, ग्राहकों के लिए एक, काम के समय के लिए एक और एक खर्च के लिए से समूह में काम बार और ग्राहकों के लिए खर्च के लिए निम्न क्वेरी का उपयोग कर रहा पर ग्रुप द्वारा और आदेश द्वारा उपयोग करते हुए:एक अंदरूनी शामिल हों SQL क्वेरी
SELECT a.*,
COALESCE(b.totalCount, 0) AS CountWork,
COALESCE(b.totalAmount, 0) AS WorkTotal,
COALESCE(c.totalCount, 0) AS CountExpense,
COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM clients A
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount
FROM work_times
WHERE DATE BETWEEN '2013-01-01' AND '2013-02-01'
GROUP BY Client
) b ON a.Client = b.Client
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount
FROM expenses
WHERE DATE BETWEEN '2013-01-01' AND '2013-02-01'
GROUP BY Client
) c ON a.Client = c.Client
WHERE b.Client IS NOT NULL OR
c.Client IS NOT NULL
आप एक पहेली here में काम कर रहे क्वेरी को देख सकते हैं।
मैं इस क्वेरी में संशोधन करने की कोशिश कर रहा हूं ताकि प्रत्येक ग्राहक के लिए प्रत्येक माह के लिए महीने और फिर ग्राहक द्वारा क्रमबद्ध प्रत्येक पंक्ति के लिए एक पंक्ति हो। मैं निम्नलिखित संशोधन क्वेरी के साथ ऐसा करने के लिए कोशिश कर रहा हूँ:
SELECT a.*,
COALESCE(b.totalCount, 0) AS CountWork,
COALESCE(b.totalAmount, 0) AS WorkTotal,
COALESCE(c.totalCount, 0) AS CountExpense,
COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM clients A
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount,
SUBSTR(Date, 1, 7) as Month
FROM work_times
GROUP BY Month,Client
ORDER BY Month
) b ON a.Client = b.Client
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount,
SUBSTR(Date, 1, 7) as Month
FROM expenses
GROUP BY Month,Client
ORDER BY Month,Client
) c ON a.Client = c.Client
WHERE b.Client IS NOT NULL OR
c.Client IS NOT NULL
आप कार्रवाई here में संशोधन क्वेरी देख सकते हैं।
हालांकि यह काफी सही काम नहीं कर रहा है। क्लाइंट बी के लिए केवल एक पंक्ति लौटा दी गई है, भले ही जनवरी 2013 में कोई कार्य समय हो और फरवरी 2013 में एक व्यय (इसलिए 2 पंक्तियां होनी चाहिए) और ऐसा लगता है कि महीनों के विपरीत क्लाइंट द्वारा पंक्तियों का आदेश दिया जा रहा है। कोई सुझाव है सका वांछित आउटपुट प्राप्त करने के लिए क्वेरी में संशोधन करने के लिए कैसे दूसरी बेला पर उदाहरण के लिए जो होगा:
╔════════╦═══════════╦═══════════╦══════════════╦══════════════╗
║ CLIENT ║ COUNTWORK ║ WORKTOTAL ║ COUNTEXPENSE ║ EXPENSETOTAL ║
╠════════╬═══════════╬═══════════╬══════════════╬══════════════╣
║ A ║ 1 ║ 10 ║ 1 ║ 10 ║
║ B ║ 1 ║ 20 ║ 0 ║ 0 ║
║ A ║ 1 ║ 15 ║ 0 ║ 0 ║
║ B ║ 0 ║ 0 ║ 1 ║ 10 ║
║ C ║ 1 ║ 10 ║ 0 ║ 0 ║
╚════════╩═══════════╩═══════════╩══════════════╩══════════════╝
आप दो उप चयन के लिए 'आदेश BY' जरूरत नहीं है। बस इसे अंतिम उत्तर के लिए रखें। –
यदि दिनांक एक डेटाटाइम डेटाटाइप है, तो आप इस पर एक substring() क्यों/कैसे करते हैं? – wildplasser
आपकी तालिकाओं में अनावश्यक डेटा, राशि और तिथि है। आपको अपनी संरचना को और सामान्य बनाने और अनावश्यकता से छुटकारा पाने की आवश्यकता है। क्वेरी बहुत संदिग्ध है, आप विशिष्ट डेटा देखना चाहते हैं लेकिन ** क्लाइंट आईडी के अलावा किसी अन्य चयन में कोई मानदंड शून्य नहीं है **। यदि आप किसी निर्दिष्ट तिथि सीमा के लिए डेटा देखना चाहते हैं, तो महीने के अनुसार समूहित करें, फिर तिथि के लिए क्वेरी करें। मैं वापस कदम उठाऊंगा और अपनी पहली समस्या के रूप में सामान्यीकरण को देखूंगा। –