我正在尝试计算从我的Oracle 12c数据库中的网站订单生成的总销售额以及有关订单的一些信息(他们的ID,库存商品ID,商品数量和商品价格)并显示总销售额同样。我提出的问题是:
SELECT L.O_ID, L.INV_ID, L.OL_QUANTITY, L.OL_PRICE, SUM(L.OL_QUANTITY * L.OL_PRICE)
FROM ORDERS O, ORDER_LINE L, ORDERSOURCE S
WHERE
S.OS_DESC = 'Web Site'
AND O.OS_ID = S.OS_ID
AND L.O_ID = O.O_ID
GROUP BY L.O_ID, L.INV_ID, L.OL_QUANTITY, L.OL_PRICE;
显示订单ID,库存ID,数量和价格,但也会显示第五列,其中每行的总价格(数量*价格),而我想要每行总价格的总和。
我环顾四周并看到了推荐的GROUP BY... WITH ROLLUP
语句,但是当我尝试以这种方式执行它时,我收到“SQL命令未正确结束”错误。
编辑:请求了有关错误的信息。以下是全文:
Error starting at line 1 in command:
SELECT L.O_ID, L.INV_ID, L.OL_QUANTITY, L.OL_PRICE, SUM(L.OL_QUANTITY * L.OL_PRICE)
FROM ORDERS O, ORDER_LINE L, ORDERSOURCE S
WHERE
S.OS_DESC = 'Web Site'
AND O.OS_ID = S.OS_ID
AND L.O_ID = O.O_ID
GROUP BY L.O_ID, L.INV_ID, L.OL_QUANTITY, L.OL_PRICE WITH ROLLUP
Error at Command Line:7 Column:54
Error report:
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 - "SQL command not properly ended"
*Cause:
*Action:
答案 0 :(得分:1)
SELECT L.O_ID, L.INV_ID, L.OL_QUANTITY, L.OL_PRICE,
SUM(L.OL_QUANTITY * L.OL_PRICE)
FROM ORDERS O, ORDER_LINE L, ORDERSOURCE S
WHERE S.OS_DESC = 'Web Site'
AND O.OS_ID = S.OS_ID
AND L.O_ID = O.O_ID
GROUP BY GROUPING SETS ((L.O_ID, L.INV_ID, L.OL_QUANTITY, L.OL_PRICE), ());
GROUPING SETS是GROUP BY子句的进一步扩展 您指定多个数据分组。这样做有助于提高效率 通过修剪您不需要的聚合来聚合。你指定 只需要所需的组,数据库不需要执行 由CUBE或ROLLUP生成的完整聚合集。 Oracle数据库 计算GROUPING SETS子句中指定的所有分组 将各个分组的结果与UNION ALL结合起来 操作。 UNION ALL表示结果集可以包含 重复行。
据我所知,你需要全部+普通的GROUP BY。在这种情况下,ROLLUP和CUBE都会产生一些额外的结果,因此最好使用GROUPING SETS,您可以在其中选择要分组的内容。