2017-06-16 32 views
0

目前,我實現了與此查詢一個表來做到這一點:如何從兩個表中總結列,如果一個月的比賽和小組按月

SELECT EXTRACT(MONTH FROM date) as month, SUM(total) as total FROM invoices   GROUP BY month ORDER BY month ASC 

但現在我要瘋了試圖返回來自兩列的結果相同,比如說total1和total2,並且按月分組,如果一個月內沒有發票,結果應該是cero。

表結構和預期的結果:

invoices payments 
date  date 
total income 


month  totalInvoices totalPayments  
1   10005   8017 
2   756335   5019 
3   541005   8017 
4   34243   8870 

如何實現這一目標?有什麼建議麼?

+0

表結構和預期輸出請。 –

+0

我修正了這個問題,@YusufHassan – Nelson

回答

2

您需要查詢結構的第三個元素,它提供所有相關年份/月份的完整列表。這可能是一個現有的表或子查詢,但整體的查詢將按照結構概述如下:

CREATE TABLE invoices 
    (`id` int, `invdate` datetime, `invtotal` numeric); 
INSERT INTO invoices 
    (`id`, `invdate`, `invtotal`) 
VALUES 
    (1, '2017-01-21 00:00:00', 12.45); 
​​
INSERT INTO payments 
    (`id`, `paydate`, `paytotal`) 
VALUES 
    (1, '2017-02-21 00:00:00', 12.45); 
select 
    ym.year, ym.month, inv.invtotal, pay.paytotal 
from (
     SELECT 
      EXTRACT(YEAR FROM invdate) as year 
     , EXTRACT(MONTH FROM invdate) as month 
     FROM invoices 
     UNION 
     SELECT 
      EXTRACT(YEAR FROM paydate) as year 
     , EXTRACT(MONTH FROM paydate) as month 
     FROM payments 
    ) ym 
left join (
    SELECT 
     EXTRACT(YEAR FROM invdate) as year 
     , EXTRACT(MONTH FROM invdate) as month 
     , SUM(invtotal) as invtotal 
    FROM invoices   
    GROUP BY year, month 
    ) inv on ym.year = inv.year and ym.month = inv.month 
left join (
    SELECT 
     EXTRACT(YEAR FROM paydate) as year 
     , EXTRACT(MONTH FROM paydate) as month 
     , SUM(paytotal) as paytotal 
    FROM payments   
    GROUP BY year, month 
    ) pay on ym.year = pay.year and ym.month = pay.month; 
 
year | month | invtotal | paytotal 
-----|-------|----------|--------| 
2017 |  1 |  12 | null | 
2017 |  2 |  null |  12 | 

在我的例子 「第三元素」 是子查詢YM,但是這可能是你的實際查詢效率太低,但它應該通過服務器來確定如何在不同的時間範圍內協調數據。

dbfiddle here

+0

這個伎倆!感謝這樣一個真棒的答案。 – Nelson