首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COUNT子句中的SQL CASE语句

问COUNT子句中的SQL CASE语句
EN

Stack Overflow用户
提问于 2009-04-27 21:23:09
回答 5查看 21.8K关注 0票数 5

我正在尝试从两个不同的表中获取产品名称及其销售数量。

我的表看起来像这样:

代码语言:javascript
复制
BOOK
Book_ID | Book_Title | Book_Author  

SOLD  
Transaction_ID | Book_ID | Customer_ID  

我可以从下面的查询中获得我想要的大部分结果

代码语言:javascript
复制
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;

但是,这仅显示至少有一次销售的产品。我想展示所有的产品,如果没有销售发生,简单地显示一个零。我一直在摆弄这样的东西:

代码语言:javascript
复制
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。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-27 21:26:57

使用左外部联接:

代码语言:javascript
复制
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;
票数 9
EN

Stack Overflow用户

发布于 2009-04-27 23:07:16

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

代码语言:javascript
复制
select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b

它既不需要group by也不需要outer joins,后者对于非常大的行数可能会很慢。

票数 1
EN

Stack Overflow用户

发布于 2009-04-27 21:28:28

正如@Vincent所说,你需要一个外部连接。我最近没怎么用过Oracle,但它专有的outer join语法相当奇怪。(我不知道他们是否在这方面赶上了ANSI。)

专有语法是:

代码语言:javascript
复制
  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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/795341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档