Я хочу вернуть набор результатов в следующем формате:
YEARMONTH Total ModelA ModelB ModelC
200101 0 0 0 0
200102 10 5 5 0
200103 8 2 2 4
где общее количество часов является суммой для всех типов моделей, сгруппированных по годам, а столбцы отдельных моделей - сумма часов для каждого типа модели, сгруппированных по годам. Я могу получить правильные результаты, используя следующий запрос с вложенными выборками:
select distinct yearmonth,
sum(a.hours) as Total,
(select sum(b.hours) from model_hours b
where model = 'ModelA' and a.yearmonth = b.yearmonth) as ModelA,
(select sum(b.hours) from model_hours b
where model = 'ModelB' and a.yearmonth = b.yearmonth) as ModelB,
(select sum(b.hours) from model_hours b
where model = 'ModelC' and a.yearmonth = b.yearmonth) as ModelC
from model_hours a
group by yearmonth
order by yearmonth
Мне было любопытно попробовать использовать сводную функцию в Oracle 11 для достижения тех же результатов, и я могу получить все результаты, кроме общих часов, используя следующий запрос:
select * from (
select yearmonth, hours, model
from model_hours a
)
pivot
(
sum(hours)
for model in ('ModelA', 'ModelB', 'ModelC')
)
order by yearmonth
, который возвращает этот результат:
YEARMONTH ModelA ModelB ModelC
200101 0 0 0
200102 5 5 0
200103 2 2 4
Я не смог выяснить, как также получить сумму часов для всех моделей, сгруппированных по годам, в этот набор результатов. Является ли это возможным? И если так, будет ли он более эффективным, чем вложенные выборки? Эта конкретная таблица имеет около 200 тыс. Строк прямо сейчас.