2013-02-03 90 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