ОПЕРАТОР ВЫБОРА SQL в ПУНКТЕ КОЛИЧЕСТВА

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

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

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 10 г.

Спасибо

5
задан Dave Jarvis 22 August 2012 в 21:19
поделиться

5 ответов

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

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
ответ дан 14 December 2019 в 01:16
поделиться

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

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

Ему не нужна ни группа по , ни external join s, который может быть медленным для очень большого числа строк.

1
ответ дан 14 December 2019 в 01:16
поделиться

Как сказал @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
ответ дан 14 December 2019 в 01:16
поделиться

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

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
ответ дан 14 December 2019 в 01:16
поделиться

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

-1
ответ дан 14 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: