查询每月数据,如何消除笛卡尔积,麻烦各位大虾指点

cgx117 2010-10-14 01:55:17
数据如下所示:
时间 数据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月份数据的结果再相加得到的,
麻烦大虾们知道一下应该怎么改正呢?谢谢了!!
...全文
248 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cgx117 2010-10-18
  • 打赏
  • 举报
回复
谢谢各位大虾的帮助,呵呵,结贴晚了,见谅哦
心中的彩虹 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 cgx117 的回复:]
数据如下所示:
时间 数据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号数据的总和,
也就是说……
[/Quote]



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




ypfe23 2010-10-14
  • 打赏
  • 举报
回复
记号标记
ojuju10 2010-10-14
  • 打赏
  • 举报
回复



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
yds_512 2010-10-14
  • 打赏
  • 举报
回复
学习~~~~~

[Quote=引用 3 楼 minitoy 的回复:]
SQL code
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 en……
[/Quote]
浪尖赏花 2010-10-14
  • 打赏
  • 举报
回复
这下该满意了吧
 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
minitoy 2010-10-14
  • 打赏
  • 举报
回复
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
cgx117 2010-10-14
  • 打赏
  • 举报
回复
好复杂,呵呵,我实在程序里面拼接的SQL文,请问大侠还有比较简便的方法吗?
浪尖赏花 2010-10-14
  • 打赏
  • 举报
回复
 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

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧