2009-04-27 13 views
5

Estoy tratando de obtener el nombre de un producto y su número de ventas de dos tablas separadas.SQL DECLARACIÓN DE CASO en COUNT CLAUSTA

Mis tablas tienen el siguiente aspecto:

BOOK 
Book_ID | Book_Title | Book_Author 

SOLD 
Transaction_ID | Book_ID | Customer_ID 

puedo conseguir la mayor parte 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 sólo muestra los 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 la cláusula WHERE 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

Respuesta

9

usar una combinació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; 
+0

Gracias, eso hizo el trabajo :) –

+0

Tenga en cuenta que COUNT() en realidad está contando el número de valores no nulos, por lo que esto funciona. –

-1

crea un otra combinación desde el libro a vendido. aún puede obtener un nulo por el conteo, pero usted lo resuelve agregando un NVL además de eso ...

0

Como dijo @Vincent, necesita una unión externa. Últimamente no he trabajado mucho con Oracle, pero su sintaxis de combinación externa patentada es bastante extraña. (No sé si han atrapados con la norma ANSI en eso.)

La sintaxis es propietaria:

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; 
0

Usted debe obtener el recuento en una subconsulta y la izquierda combinación externa a ella 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 
1

también puede utilizar una subconsulta correlacionada en la cláusula select:

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

No necesita tampoco group by o outer join s, que pueden ser lentas para un gran número de filas.