SQL istruzione case in COUNT CLAUSOLA
Domanda
Sto cercando di ottenere il nome di un prodotto e il suo numero di vendite da due tavoli separati.
I miei tavoli sono qualcosa del tipo:
BOOK
Book_ID | Book_Title | Book_Author
SOLD
Transaction_ID | Book_ID | Customer_ID
posso ottenere la maggior parte dei risultati che voglio dalla seguente query
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;
Tuttavia, questo visualizza solo i prodotti con almeno una vendita. Vorrei potrai vedere tutti i prodotti, semplicemente mostrando uno zero se non si sono verificati vendite. Sono stato nei guai con qualcosa di simile:
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;
Ma la clausola WHERE
sta limitando i risultati a quelli con 1 o più vendite.
Qualcuno può suggerire un modo per aggirare questo? Sto usando Oracle 10g.
Grazie
Soluzione
utilizzare un join esterno sinistro:
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;
Altri suggerimenti
È inoltre possibile utilizzare una subquery correlata nella clausola select
:
select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b
Non necessita né group by
o outer join
s, che può essere lento per gran numero di righe.
Come ha detto @Vincent, è necessario un outer join. Non ho lavorato molto con Oracle ultimamente, ma il suo esterno proprietaria join sintassi è piuttosto bizzarro. (Non so se hanno raggiunto con ANSI su quello.)
La sintassi proprietaria è:
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;
Si dovrebbe ottenere il conteggio in una sottoquery e lasciato join esterno ad esso, come ad esempio:
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
fa un altro join dal libro al venduto. si può ancora ottenere un nullo per il conteggio, ma risolvere che con l'aggiunta di un NVL in cima a quello ...