2014-11-09 8 views
0

Я пытаюсь рассчитать общий объем продаж, произведенный с помощью заказов на веб-сайт в моей базе данных 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 command not correct end».

Изменить: информация об ошибке была запрошена. Вот полный текст:

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

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

ответ

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 НАБОРЫ являются дальнейшим расширением предложения GROUP BY, которые позволяют указать несколько группировок данных. Это облегчает эффективную агрегацию путем обрезки агрегатов, которые вам не нужны. Вы указываете только нужным группам, и базе данных не нужно выполнять полный набор агрегатов, созданных CUBE или ROLLUP, . Oracle Database вычисляет все группы, указанные в предложении GROUPING SETS, а объединяет результаты отдельных группировок с операцией UNION ALL . UNION ALL означает, что результирующий набор может содержать повторяющиеся строки .

Как я понимаю, вам нужна общая + обычная ГРУППА BY. В этом случае ROLLUP и CUBE будут давать дополнительные результаты, поэтому лучше использовать GROUPING SETS, где вы можете выбрать, что вы собираетесь группировать.

+0

Ницца! Это было именно то, что мне нужно. Если бы я хотел запустить такой же тип выражения select в MSSQL и MySQL, мне нужно было что-нибудь изменить? – ThomYorkkke

+0

@ThomYorkkke Да, я так думаю, потому что ROLLUP/CUBE/GROUPING SETS - это специальные функции Oracle. Если вы хотите что-то универсальное, вы можете использовать UNION ALL вместо этого, но я полагаю, что он будет медленнее (в Oracle) – Multisync

Смежные вопросы