选择列并显示其总和

时间:2014-11-09 18:44:33

标签: sql select oracle12c

我正在尝试计算从我的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:

1 个答案:

答案 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,您可以在其中选择要分组的内容。