Предложение Oracle SQL GROUP BY, содержащее объединения - PullRequest
0 голосов
/ 17 декабря 2018

У меня проблемы с написанием этого запроса правильно.Ниже приведена цель, мой текущий запрос и прилагаемые сценарии для создания и заполнения базы данных.Спасибо за любую помощь!

Для каждого DVD в каталоге отобразите его название, длину, дату выпуска и сколько раз он был проверен всеми клиентами во всех библиотеках.Включите те, которые еще не были оформлены (отображается как 0).Сортировать результаты по названию.

SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, COUNT(T.TRANSACTION_ID)
FROM catalog_item C
INNER JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
INNER JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT OUTER JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE;

Выполнить первым: https://drive.google.com/open?id=1PYAZV4KIfZtxP4eQn35zsczySsxDM7ls

Выполнить вторым: https://drive.google.com/open?id=1pAzWmJqvD3o3n6YJqVUM6TtxDafKGd3f

РЕДАКТИРОВАТЬ
Я получил запрос на выполнение, но не выяснил, как получить DVD с нулевой проверкой, чтобы показать.Ниже мой обновленный запрос.

SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, COUNT(T.TRANSACTION_ID)
FROM catalog_item C
INNER JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
INNER JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT OUTER JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE, D.LENGTH, C.RELEASE_DATE;

решено
Разобрался с помощью GMB.Финальный запрос ниже!

SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, NVL(COUNT(T.TRANSACTION_ID), 0) AS NUMBER_OF_CHECKOUTS
FROM catalog_item C
INNER JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE, D.LENGTH, C.RELEASE_DATE
ORDER BY C.TITLE;

1 Ответ

0 голосов
/ 17 декабря 2018

Ваш второй запрос, безусловно, выглядит лучше, чем первый, так как он содержит правильное предложение GROUP BY.

Трудно обеспечить 100% уверенный ответ, не видя структуры полных таблиц, однако, если вывсе еще отсутствуют записи с 0 извлечениями в выводе, это означает, что один из ваших INNER JOIN s не совпадает.Другими словами, в вашем каталоге есть DVD, которых нет в таблице dvd или нет в таблице physical_item.Поскольку обе таблицы выглядят как ссылочная таблица, это может указывать на несоответствие ваших данных.Я бы порекомендовал изменить все INNER JOIN s на LEFT JOIN s, чтобы обойти эту проблему.

Также обратите внимание, что если для DVD не было извлечения, выражение COUNT(T.TRANSACTION_ID) даст NULL: следовательноВы хотите обернуть его в функцию NVL для обработки этого случая.

Новый запрос:

SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, NVL(COUNT(T.TRANSACTION_ID), 0)
FROM catalog_item C
LEFT JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE, D.LENGTH, C.RELEASE_DATE;
...