2016-03-07 65 views
0

我有兩個表如下:使用左聯接隨着Where條件

order_detail 
Fields: order_id, name, total, quantity 

order 
Fields: id, order_date 

對於每個記錄,以便有在order_detail多個記錄。

我期待獲得以下結果。

按order_date在2015年3月1日至2016年2月29日之間顯示按名稱分組的總數(總數)和金額(數量)。在這個我想看到只有總數排序前10位的項目。我寫了下面的查詢,但我只是不斷收到語法錯誤:

select od.name, sum(od.total) AS revenue, sum(od.quantity) as quantity FROM order_detail od 
LEFT JOIN order o ON o.id=od.order_id 
GROUP BY od.name ORDER BY revenue desc limit 10 
WHERE (o.completed_at)::text >= '3/1/2015' and (o.completed_at)::text <= '2/29/2016' 

你能幫我用正確的語法嗎?

+2

你'WHERE'需要在你的'GROUP BY之前' – DanK

+1

如果您在'JOIN'ed表中的列中包含檢查,那麼您可以將該'LEFT JOIN'有效地轉換爲'INNER JOIN',因此您可以使用'INNER JOIN'並將這些條件移入'JOIN'子句。 (有一些例外通常涉及檢查NULL值 –

+0

在GROUP確實解決錯誤之前移動WHERE,但它會產生一個空表。 – asanas

回答

3

您需要將這些條件移動到JOIN的條件中。把它們放入where條件有效地改變了外連接到內部聯接

你也應該沒有比較日期字符串,但日期:

select od.name, 
     sum(od.total) AS revenue, 
     sum(od.quantity) as quantity 
FROM order_detail od 
    LEFT JOIN order o ON o.id=od.order_id 
        AND o.completed_at >= DATE '2015-03-01' 
        AND o.complated_dat <= DATE '2016-02-29' 
GROUP BY od.name 
ORDER BY revenue desc limit 10