合并sql,请大家帮帮啊,谢谢

心如刀割 2011-07-11 12:39:34

select a.id,a.dt,a.val,b.sumVal from (
select id,dt, val,TO_CHAR(TO_DATE(dt), 'YYYY/MM') as mon from test a
)a ,(
select id,sum(val) as sumVal,TO_CHAR(TO_DATE(dt), 'YYYY/MM') as mon from test group by TO_CHAR(TO_DATE(dt), 'YYYY/MM') ,id
)b
where a.id= b.id and a.mon = b.mon
order by a.id,a.dt;

这个sql就是根据id查出每天的val和每个月sum出来的val。不知道能不能换种写法,因为查每天的val去检索了一次test表,查每个月sum的val又去检索了test 表。如果数据量大的话很消耗性能,这还是没有加条件的。如果在每个test表后面加上大量的条件,非常慢。能不能合并成一个???


...全文
63 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
心如刀割 2011-07-12
  • 打赏
  • 举报
回复
太感谢了。。
304的的哥 2011-07-11
  • 打赏
  • 举报
回复

--分析函数,sum(val) over (partition by to_char(dt,'yyyy-mm'))
SQL> with t as(
2 select 1 id,to_date('2011-01-01','yyyy-mm-dd') dt,50 val from dual union all
3 select 2,to_date('2011-01-05','yyyy-mm-dd'),20 from dual union all
4 select 3,to_date('2011-02-05','yyyy-mm-dd'),500 from dual union all
5 select 5,to_date('2011-02-09','yyyy-mm-dd'),100 from dual union all
6 select 6,to_date('2011-02-25','yyyy-mm-dd'),5050 from dual union all
7 select 7,to_date('2011-03-20','yyyy-mm-dd'),10000 from dual)
8 select id,dt,val,sum(val) over (partition by to_char(dt,'yyyy-mm')) sumval
9 from t
10 group by id,dt,val
11 /

ID DT VAL SUMVAL
---------- ----------- ---------- ----------
1 2011-01-01 50 70
2 2011-01-05 20 70
3 2011-02-05 500 5650
5 2011-02-09 100 5650
6 2011-02-25 5050 5650
7 2011-03-20 10000 10000

6 rows selected
小灰狼W 2011-07-11
  • 打赏
  • 举报
回复
实际上,条件够苛刻的话性能会更好...没有条件才是最糟糕的
小灰狼W 2011-07-11
  • 打赏
  • 举报
回复
分析函数
sum(val)over(partition by id,dt)

select t.id,t.dt,sum(t.val)over(partition by t.id,t.dt) sumVal
from test t
order by ...

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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