我正在尝试计算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:
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集合,在那里你可以选择要分组的内容。