#oracle
#Oracle
Вопрос:
Я работаю над отчетом со следующим кодом:
SELECT SUBS_PROV "PROV", SUM(PAID_AMT), 0, 0, 0, SUM(PAID_AMT)
FROM H
WHERE GRP = :P_POLICY AND
amp;P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE
GROUP BY SUBS_PROV
UNION ALL
SELECT PROV "PROV", 0, SUM(PAID_AMT), 0, 0, SUM(PAID_AMT)
FROM D
WHERE GRP = :P_POLICY AND
amp;P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE
GROUP BY PROV
UNION ALL
SELECT PROV "PROV", 0, 0, SUM(PAID_AMT), 0, SUM(PAID_AMT)
FROM E
WHERE GRP = :P_POLICY AND
amp;P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE
GROUP BY PROV
UNION ALL
SELECT SUBS_PROV "PROV", 0, 0, 0, SUM(PAID_AMT), SUM(PAID_AMT)
FROM R
WHERE GRP = :P_POLICY AND
amp;P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE
GROUP BY SUBS_PROV
В этом запросе в модели данных есть столбец TOTAL, и я должен добавить «ORDER BY», потому что в Oracle 11g group by больше не работает.
Когда я добавляю «ПОРЯДОК ПО 1» в самом конце и запускаю отчет, он меняет итоговые значения H на итоговые значения столбца TOTAL. Есть ли способ добавить ПОРЯДОК без изменения этих столбцов?
Спасибо!
Комментарии:
1. «в Oracle 11g group by больше не работает» — ошибка?
2. Я могу подтвердить после эмпирического тестирования, что GROUP BY действительно работает в 11g. Поэтому вы должны использовать его, который не работает в 11g.
3. @Ollie — Я подозреваю, что проблема в том, что GROUP BY использует более эффективный алгоритм хеширования в 11g (и работает с 10g), что означает, что результаты больше не сортируются по агрегирующим столбцам. В то время как в более ранних версиях Oracle GROUP BY возвращал отсортированные результаты. В документах это указано как побочный эффект дизайна, на который нельзя полагаться: только ORDER BY гарантирует порядок сортировки. Однако на практике GROUP BY сделала свое дело, поэтому многие люди полагались на это и не беспокоились о дополнительной сортировке. Отсюда и шок, когда «под Oracle 11g group by больше не работает».
4. APC, я знаю, я просто высказал точку зрения.
Ответ №1:
Вы должны добавлять ORDER BY
после каждого GROUP BY
, а не только в конце.