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

¿Fue útil?

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 joinS, 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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top