2017-07-15 113 views
0

我有兩個表:發票MySQL SUM通過虛擬子查詢字段(與另一個SUM)與GROUP BY

發票

id | timest 

id | invoice_id | price | qty 

很明顯的發票可以具有若干項 - items.invoice_id = invoices.id

我有一個與他們的項目的總和選擇所有發票以下查詢:按週期

id| _period | total 
------------------- 
1 | 2014-06 | 100 
4 | 2014-06 | 200 
5 | 2014-07 | 660 
6 | 2014-07 | 300 
7 | 2014-07 | 30 
9 | 2015-02 | 225 

現在我想組吧:

SELECT id, DATE_FORMAT(FROM_UNIXTIME(inv.time), "%Y-%m") AS _period, 
(SELECT SUM(it.price*it.quantity) FROM items AS it WHERE it.invoice_id=inv.id) as total 
FROM `invoices` `inv` 

這會產生什麼樣有輸出爲:

_period | qty | total_price 
--------------------------- 
2014-06 | 2 | 300 
2014-07 | 3 | 990 
2015-02 | 1 | 224 

我可以很容易地將它作爲數量字段作爲

SELECT DATE_FORMAT(FROM_UNIXTIME(inv.time), "%Y-%m") AS _period, 
COUNT(inv.id) as qty 
FROM `invoices` `inv` 
GROUP BY _period 

但我無法弄清楚如何在類似的事情可能對TOTAL_PRICE領域,這從一個子查詢的虛擬域結果做什麼?有人有什麼主意嗎?

謝謝!

SELECT DATE_FORMAT(FROM_UNIXTIME(i.time, '%Y-%m') AS _period, 
     COUNT(DISTINCT i.id) as num_invoices 
     SUM(i.price * it.quantity) as total 
FROM invoices i LEFT JOIN 
    items it 
    ON it.invoice_id = i.id 
GROUP BY _period 
ORDER BY _period; 

回答

0

你應該這樣使用LEFT JOINGROUP BY做。

+0

謝謝你很多!這完全解決了! –

0

試試這個

SELECT InnerTable._period, Count(InnerTable.id) as id, Sum(InnerTable.total) as total FROM 
    (SELECT id, DATE_FORMAT(FROM_UNIXTIME(inv.time), "%Y-%m") AS _period, 
(SELECT SUM(it.price*it.quantity) FROM items AS it WHERE it.invoice_id=inv.id) as total 
FROM `invoices` `inv`) as InnerTable FROM GROUP BY InnerTable._period. 

從查詢使子表,然後通過它把組: