Declaración de caso SQL en la cláusula de conteo
Pregunta
Estoy tratando de obtener el nombre de un producto y su número de ventas de dos tablas separadas.
Mis tablas se ven como esto:
BOOK
Book_ID | Book_Title | Book_Author
SOLD
Transaction_ID | Book_ID | Customer_ID
Puedo obtener la mayoría de los resultados que quiero de la siguiente consulta
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;
Sin embargo, esto solo muestra productos con al menos una venta. Me gustaría mostrar todos los productos, simplemente mostrando un cero si no se han producido ventas. He estado jugando con algo como esto:
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;
Pero el WHERE
La cláusula está limitando los resultados a los que tienen 1 o más ventas.
¿Alguien puede sugerir una forma de evitar esto? Estoy usando Oracle 10g.
Gracias
Solución
Use una unión externa izquierda:
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;
Otros consejos
También puede usar una subconsulta correlacionada en el select
Cláusula:
select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b
Tampoco necesita group by
o outer join
S, que puede ser lento para una gran cantidad de filas.
Como dijo @Vincent, necesitas una unión externa. No he trabajado mucho con Oracle últimamente, pero su sintaxis de unión externa patentada es bastante extraña. (No sé si han alcanzado ANSI en eso).
La sintaxis patentada es:
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;
Debe obtener el conteo en una subconsulta y se unirá a él como tal:
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
Haga una otra unión del libro a vendido. Todavía puede obtener un nulo para el recuento, pero lo resuelve agregando un NVL además de eso ...