如何按产品对sql语句进行排序以及报告数量

时间:2016-03-21 12:32:35

标签: sql oracle oracle-sqldeveloper

我正在尝试执行将回答以下问题的查询: “2004年5月订购的产品数量是多少?按每个产品的订购数量按降序排列”

到目前为止,我已成功检索到2004年5月订购的所有产品的清单。但是,我不知道如何为每种产品进行排序。我按表达式尝试了一组(按PRODUCTNAME分组)并收到错误“Not a GROUP BY expression”(我在下面的工作查询末尾添加了“GROUP BY PRODUCTNAME”。)

这是我到目前为止的工作查询:

SELECT ORDERS.ORDERNUMBER, PRODUCTS.PRODUCTNAME, ORDERS.SHIPPEDDATE
FROM ORDERS,
     PRODUCTS
WHERE SHIPPEDDATE LIKE '%MAY-04';

以下是我的输出图片:Output from working query above

所以问题是这样的:我如何执行这部分查询? “按每个产品按降序排序的数量报告”

2 个答案:

答案 0 :(得分:3)

您想要的查询如下所示:

SELECT p.PRODUCTNAME, COUNT(*)
FROM ORDERS o JOIN
     PRODUCTS p
     ON o.PRODUCTID = p.PRODUCTID
WHERE o.SHIPPEDDATE >= DATE '2004-05-01' AND SHIPPEDDATE < DATE '2004-06-01'
GROUP BY p.PRODUCTNAME;

注意:

  • 学习使用显式JOIN语法。简单规则:从不FROM子句中使用逗号。 始终使用JOIN
  • 对于日期比较,请使用内置函数和运算符作为日期。不要不必要地转换为字符串。
  • 我对日期常量的偏好是ISO标准YYYY-MM-DD格式,而不是Oracle的默认格式。
  • 您需要汇总,但请在SELECT
  • 之外留出额外的列

答案 1 :(得分:2)

首先,进行正确的连接,然后添加GROUP BY

SELECT o.ORDERNUMBER, p.PRODUCTNAME, SUM(od.quantity)
FROM ORDERS o
  JOIN order_details od ON o.ORDERNUMBER= od.ORDERNUMBER
  JOIN PRODUCTS p ON od.ProductCode = p.ProductCode
WHERE SHIPPEDDATE LIKE '%MAY-04'
GROUP BY o.ORDERNUMBER, p.PRODUCTNAME

我不太了解Oracle,但我想你可以做类似

的事情
WHERE YEAR(SHIPPEDDATE) = 2004 and MONTH(SHIPPEDDATE) = 5

或者,正如Gordon Linoff的回答

WHERE SHIPPEDDATE >= DATE '2004-05-01' AND SHIPPEDDATE < DATE '2004-06-01'