如何按产品对我的 sql 报表进行排序以及报告数量
How to sort my sql statement by products as well as report a quantity
我正在尝试执行将回答以下问题的查询:
"What products in what quantity were ordered in May 2004? Report by quantity ordered sorted for each product in descending order"
到目前为止,我已成功检索到2004年5月订购的所有产品的列表。但是,我不知道如何对每个产品进行排序。我尝试了按表达式分组(按 PRODUCTNAME 分组)并得到错误“不是 GROUP BY 表达式”(我在下面的工作查询的末尾添加了 "GROUP BY PRODUCTNAME"。)
这是我到目前为止的工作查询:
SELECT ORDERS.ORDERNUMBER, PRODUCTS.PRODUCTNAME, ORDERS.SHIPPEDDATE
FROM ORDERS,
PRODUCTS
WHERE SHIPPEDDATE LIKE '%MAY-04';
这是我的输出图像:
所以问题是:如何执行这部分查询? "Report by quantity ordered sorted for each product in descending order"
首先,进行适当的连接,然后添加 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'
您想要的查询如下所示:
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
中保留额外的列。
我正在尝试执行将回答以下问题的查询: "What products in what quantity were ordered in May 2004? Report by quantity ordered sorted for each product in descending order"
到目前为止,我已成功检索到2004年5月订购的所有产品的列表。但是,我不知道如何对每个产品进行排序。我尝试了按表达式分组(按 PRODUCTNAME 分组)并得到错误“不是 GROUP BY 表达式”(我在下面的工作查询的末尾添加了 "GROUP BY PRODUCTNAME"。)
这是我到目前为止的工作查询:
SELECT ORDERS.ORDERNUMBER, PRODUCTS.PRODUCTNAME, ORDERS.SHIPPEDDATE
FROM ORDERS,
PRODUCTS
WHERE SHIPPEDDATE LIKE '%MAY-04';
这是我的输出图像:
所以问题是:如何执行这部分查询? "Report by quantity ordered sorted for each product in descending order"
首先,进行适当的连接,然后添加 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'
您想要的查询如下所示:
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
中保留额外的列。