पहले योग बनाओ, फिर जुड़ो। इस तरह:
SELECT i.uid
,i.date
,i.v_in
,COALESCE(o.v_out, 0) AS v_out
,(i.v_in - COALESCE(o.v_out, 0)) AS balance
FROM (
SELECT date
,uid
,SUM(value_in) AS v_in
FROM table1
GROUP BY 1,2
) i
LEFT JOIN (
SELECT date
,uid
,SUM(value_out) AS v_out
FROM table2
GROUP BY 1,2
) o USING (date, uid)
जिस तरह से आपके पास था, हर value_in
प्रत्येक मिलान value_out
. के साथ जोड़ा जाएगा , इस प्रकार संख्याओं को गुणा करना। आपको पहले समेकित करना होगा और फिर आप एक . में शामिल होंगे एक . के साथ कुल मिलाकर आउट-सम और सब कुछ ग्रोवी है। या है?
अगर कोई value_in
नहीं है तो क्या होगा? या value_out
किसी दिए गए (date, uid)
. के लिए ? या केवल value_in
या सिर्फ value_out
? आपकी क्वेरी विफल हो जाएगी।
मैंने LEFT JOIN
. का उपयोग करके सुधार किया है [INNER] JOIN
. के बजाय , लेकिन जो आप वास्तव में चाहते हैं वह है FULL OUTER JOIN
- MySQL में अनुपलब्ध सुविधाओं में से एक।
आप या तो एक अलग तालिका में दिनों की सूची प्रदान कर सकते हैं और LEFT JOIN
इसके लिए दोनों टेबल, या आप दो बार LEFT JOIN
. के साथ लापता फीचर के आसपास काम कर सकते हैं और UNION
. यहां देखें उदाहरण के लिए
।
या आप अपने value_out
को गुणा कर सकते हैं द्वारा -1
यूनियन दोनों टेबल एक साथ और एक योग बनाते हैं।
लेकिन आप अभी भी बिना किसी value_in
. के एक दिन के लिए कोई पंक्ति नहीं मिलेगी या value_out
, जो आपके विवरण का उल्लंघन करता है।
तो, एकमात्र स्वच्छ समाधान सभी (date, uid)
. के साथ एक टेबल होना है आप परिणाम में चाहते हैं और LEFT JOIN
table1
. का योग और table2
इसके लिए, या UNION ALL
तीन (नकारात्मक table2
) उप-चयन में और फिर योग करें।