2012-03-26 2 views
2

Я хочу вернуть результирующий набор в следующем формате:Oracle - возвращающая суммарная сумма, а также сводные суммарные суммы?

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 

Я не был в состоянии понять, как же получить сумму часов для всех моделей, г в течение года, в этот набор результатов. Является ли это возможным? И если это так, возможно, это будет более эффективно, чем вложенные selects? Эта конкретная таблица имеет около 200 тыс. Строк прямо сейчас.

ответ

4

От 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 раз быстрее, чем исходный запрос со скалярными подзапросами!

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