COUNT CLAUSE中的SQL CASE语句

时间:2009-04-27 21:23:09

标签: sql join count case

我正在尝试从两个单独的表中获取产品的名称和销售数量。

我的表看起来像这样:

BOOK
Book_ID | Book_Title | Book_Author  

SOLD  
Transaction_ID | Book_ID | Customer_ID  

我可以通过以下查询获得我想要的大部分结果

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;

但是,这仅显示至少有一次销售的产品。我想显示所有产品,如果没有销售,只显示零。我一直在搞乱这样的事情:

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;

但是WHERE条款将结果限制为具有1个或更多销售额的结果。

有人可以建议解决这个问题吗?我正在使用Oracle 10g。

由于

5 个答案:

答案 0 :(得分:9)

使用左外连接:

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;

答案 1 :(得分:1)

您还可以在select子句中使用相关子查询:

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

它不需要group byouter join,对于非常多的行来说可能会很慢。

答案 2 :(得分:0)

正如@Vincent所说,你需要一个外连接。我最近没有与Oracle合作过多,但其专有的外连接语法相当奇怪。 (我不知道他们是否已经赶上了ANSI。)

专有语法是:

  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;

答案 3 :(得分:0)

您应该在子查询中获取计数,并将外部联接保留为:

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

答案 4 :(得分:-1)

从书到卖另一个联盟。 您仍然可以获得计数的空值,但是您可以通过在其上添加NVL来解决此问题...