2013-02-03 116 views
2

我有三張桌子。如何查詢這種情況?

Category(id, name); 
Item(id, name, category); 
SoldItem(id, item, qty); 

我的目標很簡單,我想列出這些類別的所有類別加項目計數再加上那些特定類別的行項目的銷售的物品的數量。

結果會是這樣:

Category | Item count | Item sold count 
---------------------------------------- 
Food  | 2   | 50 
---------------------------------------- 
Beverage | 3   | 60 

如何在PostgreSQL中查詢此。提前致謝。

+0

對不起,忘了補充一點。 – William

回答

3

的關鍵是計算行時從中間連接表使用count(distinct),否則多的孫子會導致同樣的專利正在清點過多次:

select 
    c.name as category, 
    count(distinct i.id) as item_count, 
    sum(si.qty) as item_sold_count 
from Category c 
left join Item i on i.category = c.id 
left join SoldItem si on si.item = i.id 
group by c.name; 

通過使用left連接,類無項目,和銷售項目,仍然會顯示,但總計爲零。

+0

count(i.id)不顯示實際數字,因爲它受SoldItem中與該特定項目相關的行數影響。 – William

+0

@William oops - 我遺漏了'distinct'。現在修復。謝謝。 – Bohemian

+0

謝謝!你總是很有幫助。 – William