2013-02-03 3 views
2

J'ai trois tables.Comment interroger ce cas?

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

Mon but est simple, je veux énumérer toutes les catégories ainsi que le nombre élément de ces catégories ainsi que le nombre d'articles vendus des articles de ces catégories sous forme de lignes.

Le résultat serait comme ceci:

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

Comment faire une requête dans ce PostgreSQL. Merci d'avance.

+0

Désolé, j'ai oublié d'ajouter ça. – William

Répondre

3

La clé est d'utiliser count(distinct) lors du comptage des lignes à partir du milieu table jointe, sinon plusieurs petits-enfants se traduiraient dans le même brevet étant compté plusieurs fois aussi:

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; 

En utilisant left jointures, catégories sans objets, et les articles avec des ventes, montreront toujours mais avec des zéros pour les totaux.

+0

le nombre (i.id) n'affiche pas le nombre réel car il est affecté par le nombre de lignes dans le SoldItem qui se rapportent à cet élément particulier. – William

+0

@William oups - J'ai omis 'distinct'. Fixé maintenant Merci. – Bohemian

+0

Merci! Tu es tellement utile comme toujours. – William