Oracle - возвращает совокупную сумму, а также сводные совокупные суммы? - PullRequest
2 голосов
/ 26 марта 2012

Я хочу вернуть набор результатов в следующем формате:

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 тыс. Строк прямо сейчас.

1 Ответ

4 голосов
/ 27 марта 2012

На forums.oracle.com есть несколько аналогичных способов сделать это ... самый простой синтаксис выглядит так:

select yearmonth,ModelA + ModelB + ModelC Total,ModelA,ModelB,ModelC from (
    select yearmonth, hours, model
    from model_hours a
)
pivot
( 
    sum(hours)
    for model in ('ModelA' as ModelA, 'ModelB' as ModelB, 'ModelC' as ModelC)
)
order by yearmonth

Кроме того, поворотные запросы примерно в 100 раз быстреечем исходный запрос со скалярными подзапросами!

...