按特定季度计算减法

时间:2012-03-27 08:16:38

标签: sql database oracle plsql

我在SQL生成后有一些记录:

YEARS MONTHS SUMMONTH SUMQUARTER QTR
----- ------ -------- ---------- ---
 2009 Jan      363639     855922 1   
 2009 Feb      128305     855922 1   
 2009 Mar      363978     855922 1   
 2009 Apr      376633    1058871 2   
 2009 May      299140    1058871 2   
 2009 Jun      383098    1058871 2   
 2009 Jul      435000    1063577 3   
 2009 Aug      266227    1063577 3   
 2009 Sep      362350    1063577 3   
 2009 Oct      449366    1017906 4   
 2009 Nov      280943    1017906 4   
 2009 Dec      287597    1017906 4   
 2010 Jan      418277     661083 1   
 2010 Feb      129895     661083 1   
 2010 Mar      112911     661083 1   
 2010 Apr      163593     685625 2   
 2010 May      228505     685625 2   
 2010 Jun      293527     685625 2   
 2010 Jul      451608    1044364 3   
 2010 Aug      356683    1044364 3   
 2010 Sep      236073    1044364 3   
 2010 Oct      247365     798925 4   
 2010 Nov      414100     798925 4   
 2010 Dec      137460     798925 4   

 24 rows selected 

SUMQUARTER列总结了每一季度...... qtr指定它属于哪个季度。

问题是如何在2年不同年份之间减去总部以获得具体的查询结果?

差异不是:max value-min值。 这是他想要输入的用户定义的值...

让我们说...... 例如,用户想要查看2009 qtr = 2和2010 qtr = 2之间的减法(sumquarter), 用户可以更改sql的参数(years,qtr)来查看记录。

这意味着结果应为:(1058871 - 685625)

以下是我目前使用的SQL:

select years,months,summonth,sumquarter,qtr

from(
        select years,months,summonth,sumhour,hours,to_char(ym, 'Q') qtr,
                sum(sumhour) over(partition by years || to_char(ym, 'Q') order by years || to_char(ym, 'Q')) sumquarter,ym,
                count(days) over(partition by years,months,hours) days_month

        from(
                select   years, months, days, hours, mins, sumHour,
                         SUM (sumHour) OVER (PARTITION BY years,months,days) sumDay,
                         SUM (sumHour) OVER (PARTITION BY years,months) sumMonth,
                         SUM (sumHour) OVER (PARTITION BY years) sumyear,
                         to_date(years || months, 'YYYYMon', 'NLS_DATE_LANGUAGE=American') ym
                from  (

                        SELECT x.years, x.months, x.days, x.hours, x.mins, sum(x.value) as sumHour
                        FROM xmltest,
                             XMLTABLE ('$d/cdata/name' passing doc as "d"
                                        COLUMNS
                                          years integer path 'year',
                                          months varchar(3) path 'month',
                                          days varchar(2) path 'day',
                                          hours varchar(2) path 'hour',
                                          mins varchar(2) path 'minute',
                                          value float path 'value'
                                       ) as X
                        group by x.years, x.months, x.days, x.hours, x.mins
                        order by x.years, x.months, x.days
                      )
             )
    )

  group by years,months,summonth,sumquarter,qtr,ym
  order by ym

sql模式可能是这样的:...... ??

select ((select sumquarter from table where years=2009 and qtr=2) - (select sumquarter from table where years=2010 and qtr=2)) from table

实际上,它不起作用......

结果可能在这个视图中看:

SUBTRACT 
---------- 
373246

谢谢大家的帮助!! :)

2 个答案:

答案 0 :(得分:0)

尝试此查询:

select (case when years=2009 and qtr=2 then sumquater end) - (case when years=2010 and qtr=2 then sumquater end) from table

答案 1 :(得分:0)

我会使用以下内容:

select 
((select sumquarter from table where years=2009 and qtr=2 and rownum=1) - 
 (select sumquarter from table where years=2010 and qtr=2 and rownum=1)) as substract
from dual