Question

Je suis en train d'obtenir un nom de produit et son nombre de ventes de deux tables séparées.

Mes tableaux ressemblent à ceci:

BOOK
Book_ID | Book_Title | Book_Author  

SOLD  
Transaction_ID | Book_ID | Customer_ID  

Je peux obtenir la plupart des résultats que je veux de la requête suivante

SELECT b.Book_Title, COUNT(s.Book_ID) FROM Book b, Sold s 
WHERE b.Book_ID = s.Book_ID 
GROUP BY b.Book_Title;

Toutefois, cette option affiche uniquement des produits avec au moins une vente. Je voudrais afficher tous les produits, montrant simplement un zéro si aucune vente n'a eu lieu. J'ai été déconner avec quelque chose comme ceci:

SELECT b.Book_Title, 
       COUNT(CASE WHEN s.Book_ID IS NULL THEN 0 ELSE s.Book_ID END) 
FROM Book b, Sold s WHERE b.Book_ID = s.Book_ID GROUP BY Book_Title;

Mais la clause WHERE limite les résultats à ceux avec 1 ou plus de ventes.

Quelqu'un peut-il suggérer une façon de contourner cela? J'utilise Oracle 10g.

Merci

Était-ce utile?

La solution

utiliser une jointure externe gauche:

SELECT b.Book_Title, COUNT(s.Book_ID) 
FROM Book b left outer join Sold s on b.Book_ID = s.Book_ID 
GROUP BY b.Book_Title;

Autres conseils

Vous pouvez également utiliser une sous-requête corrélée à la clause select:

select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b

Il n'a pas besoin ni group by ou outer joins, qui peut être lent pour très grand nombre de lignes.

Comme dit @Vincent, vous avez besoin d'une jointure externe. Je ne l'ai pas beaucoup travaillé avec Oracle ces derniers temps, mais son extérieur propriétaire rejoindre syntaxe est plutôt bizarre. (Je ne sais pas s'ils ont pris à la norme ANSI sur ce point.)

La syntaxe est propriétaire:

  SELECT b.Book_Title,
         COUNT(s.Book_ID)
    FROM Book b,
         Sold s
   WHERE b.Book_ID = s.Book_ID (+)
GROUP BY b.Book_Title;

Vous devriez obtenir le nombre dans une sous-requête et extérieure pour se joindre à gauche comme tel:

select b.book_title, 
   case when s.book_id is null then 0 
       else s.salesCount end as Sales
from book b
left outer join 
  (select count(*) as salesCount, book_id from sales group by book_id) s on b.book_id = s.book_id

faire une autre jointure du livre vendu. vous pouvez toujours obtenir un nul pour le compte, mais vous résoudre ce en ajoutant un NVL au-dessus de ça ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top