包含联接的Oracle SQL GROUP BY子句

时间:2018-12-17 01:20:34

标签: sql join oracle11g group-by

我在正确编写此查询时遇到问题。下面是目标,我当前的查询以及随附的用于构建和填充数据库的脚本。感谢您的协助!

  

对于目录中的每张DVD,显示其标题,长度,发行日期,以及所有库中所有客户已检出该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 :(得分:1)

您的第二个查询肯定比第一个查询好,因为它具有正确的GROUP BY子句。

很难在不看到完整表结构的情况下提供100%确定的响应,但是,如果您仍然缺少输出中检出0的记录,则意味着您的INNER JOIN之一不匹配。换句话说,您的目录中的DVD要么不在dvd表中,要么不在physical_item表中。由于两个表都看起来像是引用表,因此这可能表明您的数据存在差异。我建议将所有INNER JOIN更改为LEFT JOIN,以解决此问题。

还请注意,如果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;