Выбор столбцов и отображение их суммы

Я пытаюсь рассчитать общий объем продаж, полученный от заказов на веб-сайте, в моей базе данных Oracle 12c, а также некоторую информацию о задействованных заказах (их идентификатор, идентификаторы товаров, количество и цена товара), а также отобразить общий объем продаж. Я придумал запрос:

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;

который отображает идентификатор заказа, идентификатор инвентаря, количество и цену, но также отображает пятый столбец, в котором указана только общая цена для каждой строки (количество * цена), тогда как мне нужна сумма общей цены каждой строки.

Я осмотрелся и увидел рекомендуемый оператор 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:

person ThomYorkkke    schedule 09.11.2014    source источник
comment
Я только что изменил исходный вопрос, чтобы отобразить полный текст сообщения об ошибке.   -  person ThomYorkkke    schedule 09.11.2014


Ответы (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, где вы можете выбрать, что вы собираетесь группировать.

person Multisync    schedule 09.11.2014
comment
Хороший! Это было именно то, что мне было нужно. Если бы я хотел запустить один и тот же тип оператора select в MSSQL и MySQL, нужно ли было бы мне что-то менять? - person ThomYorkkke; 09.11.2014
comment
@ThomYorkkke Да, я так думаю, потому что ROLLUP/CUBE/GROUPING SETS являются специфическими функциями Oracle. Если вам нужно что-то универсальное, вы можете вместо этого использовать UNION ALL, но я полагаю, что это будет медленнее (в Oracle) - person Multisync; 09.11.2014