数据如下所示:
  时间            数据1    数据2   地域(F_REGIONNAME)
2010-06-01 10 12        XX省
2010-06-01 15 3         XX省
2010-07-01 20 32        XX省
2010-07-01 30 10        XX省
2010-07-01 25 55        XX省



我想求6月份的数据,方法是用7月1号的数据的总和减去6月1号数据的总和,
也就是说:数据1等于20+30+25-10-15=50
数据2等于32+10+55-12-3=82
我写的SQL文如下:
SELECT TBD1.F_REGIONNAME,
       SUM(TBD2.数据1) - sum(TBD1.数据1)  data1,
       SUM(TBD2.数据2) - sum(TBD1.数据2)  data2
  FROM TB_BAS_PRODAYHAZARDDATA TBD1, TB_BAS_PRODAYHAZARDDATA TBD2
 WHERE TBD1.F_REGIONCODE = TBD2.F_REGIONCODE
   AND TBD1.F_STATICDAYTIME = '2010-06-01'
   AND TBD2.F_STATICDAYTIME = '2010-07-01'
 GROUP BY TBD1.F_REGIONNAME不知道这样写有什么不妥,每次查询结果都是
地域     data1    data2
XX省      75       149
这两个结果我算了一下是每个7月份数据减去6月份数据的结果再相加得到的,
麻烦大虾们知道一下应该怎么改正呢?谢谢了!!

解决方案 »

  1.   

     select a.F_REGIONNAME,a.d1-nvl(b.d1,0),a.d2-nvl(b.d2,0) from (
     select F_REGIONNAME,sum(d1) d1,sum(d2) d2 from TB_BAS_PRODAYHAZARDDATA where F_STATICDAYTIME = '2010-07-01'
     group by F_REGIONNAME) a
     left join 
     (select F_REGIONNAME,sum(d1) d1,sum(d2) d2 from TB_BAS_PRODAYHAZARDDATA where F_STATICDAYTIME = '2010-06-01'
     group by F_REGIONNAME) b
     on a.F_REGIONNAME = b.F_REGIONNAME
      

  2.   

    好复杂,呵呵,我实在程序里面拼接的SQL文,请问大侠还有比较简便的方法吗?
      

  3.   

    SELECT TBD.F_REGIONNAME,
      SUM(case F_STATICDAYTIME when  '2010-06-01' then  -TBD.数据1 else TBD.数据1 end ) data1,
      SUM(case F_STATICDAYTIME when  '2010-06-01' then  -TBD.数据2 else TBD.数据2 end ) data2
      FROM TB_BAS_PRODAYHAZARDDATA TBD
     WHERE TBD.F_STATICDAYTIME in ( '2010-06-01','2010-07-01')
     GROUP BY TBD.F_REGIONNAME
      

  4.   

    这下该满意了吧
     select F_REGIONNAME,sum(d1),sum(d2)
       from (select decode(F_STATICDAYTIME,'2010-07-01',d1,'2010-06-01',0-d1,0) d1,
                    decode(F_STATICDAYTIME,'2010-07-01',d2,'2010-06-01',0-d2,0) d2,
                    F_REGIONNAME
               from TB_BAS_PRODAYHAZARDDATA)
      group by F_REGIONNAME
      

  5.   


    select date ,sum(data1),sum(data2)
    from 
    (
       select date,(case when to_char(date,'YYYY-MM-DD')='2010-06-01' then -1*data1 else data1 end) as data1, 
       (case when to_char(date,'YYYY-MM-DD')='2010-06-01' then -1*data2 else data2 end) as data2
       from tb
    )
    group by date
      

  6.   


    SELECT TBD1.F_REGIONNAME,
    sum(decode(TBD1.F_STATICDAYTIME,'2010-06-01',-1*TBD1.数据1,TBD1.数据1)) data1,
    sum(decode(TBD1.F_STATICDAYTIME,'2010-06-01',-1*TBD1.数据2,TBD1.数据2)) data2
    FROM TB_BAS_PRODAYHAZARDDATA TBD1
    WHERE TBD1.F_STATICDAYTIME in('2010-06-01','2010-07-01')
    GROUP BY TBD1.F_REGIONNAME