SQL CASE ЗАЯВЛЕНИЕ в COUNT CLAUSE - PullRequest
5 голосов
/ 28 апреля 2009

Я пытаюсь получить название продукта и количество продаж из двух отдельных таблиц.

Мои таблицы выглядят примерно так:

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 ]

9 голосов
/ 28 апреля 2009

использовать левое внешнее соединение:

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 голос
/ 28 апреля 2009

Вы также можете использовать коррелированный подзапрос в предложении select:

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

Не требуется group by или outer join с, что может быть медленным для очень большого количества строк.

0 голосов
/ 28 апреля 2009

Вы должны получить количество в подзапросе и оставить внешнее соединение с ним следующим образом:

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
0 голосов
/ 28 апреля 2009

Как сказал @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;
0 голосов
/ 28 апреля 2009

сделать другое соединение от книги до продано. вы можете все равно получить нулевое значение для счетчика, но вы решаете это, добавляя NVL поверх этого ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...