2012-03-26 104 views
2

我想回到以下列格式的结果集:Oracle - 返回汇总数以及汇总汇总数?

YEARMONTH Total ModelA ModelB ModelC 
200101 0  0  0  0 
200102 10 5  5  0 
200103 8  2  2  4 

其中总的的时间由yearmonth分组的所有模型类型的总和,以及个别型号列的每个模型小时的总和类型按yearmonth分组。我可以使用嵌套选择以下查询得到正确的结果:

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 

我一直无法弄清楚如何也得​​到的时间总和为所有车型,G根据yearmonth进行分组,转换为此结果集。可能吗?如果是这样,它可能会比嵌套选择更有效率吗?这个特定的表格现在有大约200K行。

回答

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倍具有标量子查询的原始查询!