Я бы порекомендовал смотреть на группировку наборов, а не на объединение данных вместе. Группировка наборов (наряду с CUBE
и ROLLUP
) - это способы агрегирования данных на нескольких уровнях, что, по-видимому, и происходит. Использование групповых наборов позволит получить данные, которые вы ищете.
Чтобы отсортировать данные, вам нужно добавить дополнительные столбцы к заказу по предложению. Функция grouping_id (), которую я использовал, возвращает число (0 или 1) в зависимости от того, является ли это строкой 'superaggregate' или нет для данного выражения. Эти «суперагрегатные» строки являются дополнительными строками, которые относятся к итоговым и промежуточным суммам. Я сортирую данные и выясняю, является ли столбец суперагрегатом или нет.
Думаю, вы сможете сделать что-то вроде:
SELECT
COLUMN1 AS LASTNAME,
COLUMN2 AS FIRSTNAME,
case
when grouping_id(column3, substr(column3,3,3)) = 3 then 'Total'
when grouping_id(column3, substr(column3,3,3)) = 2
then substr(column3,3,3) ||' Total'
else column3 end as location,
SUM(COLUMN4) AS ACTIVITYNM1,
SUM(COLUMN5) AS ACTIVITYNM2,
SUM(COLUMN6) AS ACTIVITYNM3,
SUM(COLUMN7) AS ACTIVITYNM4,
SUM(COLUMN8) AS ACTIVITYNM5,
SUM(COLUMN9) AS REG_HRS,
SUM(COLUMN10) AS OT_HRS,
SUM(COLUMN11) AS TOTAL_HRS,
SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE
FROM TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE))
GROUP BY grouping sets ((), (substr(column3,3,3)),
(COLUMN1,COLUMN2,COLUMN3, substr(column3,3,3)))
order by
grouping_id(substr(column3,3,3)),
substr(column3,3,3) desc,
grouping_id(column3, substr(column3,3,3)),
column3 desc
Будем надеяться, быстрее бегать и делать то, что вы хотите. Я мог бы сделать заказ по пункту более сложным, чем необходимо, но он должен делать то, что вам нужно.