SQL累计求和的优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL累计求和的优化相关的知识,希望对你有一定的参考价值。
select ADDVCD , yyyy,mm,dt,
--当日数据
day_w,
--月累计
(select sum(day_w) from
(select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt)
where ADDVCD=t.ADDVCD and yyyy=t.yyyy and mm=t.mm and dt<=t.dt)
as mm_w,
--年累计
(select sum(day_w) from
(select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt)
where ADDVCD=t.ADDVCD and yyyy=t.yyyy and dt<=t.dt)
as yyyy_w
from (select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt) t
请问大家,我上面这个累计月、年求和的sql 执行效率很慢,如何可以优化呢,请指教
不使用月累计和年累计的情况下,为10000条数据,执行速度20秒
select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt
然后再进行其他累计的查询。追问
真正慢的地方应该是累计的 sum函数 每一行都要都要计算sum 这个有办法破么
追答所以就应该建立一个视图索引让其提前完成一部分的统计,而且只一句sql我见你是反复使用的。
追问我已经知道问题出在索引身上了,子查询是不能用了,视图也建不了索引,愁人
追答为什么建立不了视图?
追问要建一个视图索引?
参考技术B 用 join 或者case会很快啊追问真真慢的地方应该是累计的 sum函数 每一行都要都要计算sum 这个有办法破么
追答朋友,就是用case呀 给你个例子
select rq ,
sum(case when shengfu ='胜' then 1 else 0 end) as 胜 ,
sum(case when shengfu ='负'then 1 else 0 end)as 负
from #tmp group by rq
你这是一个逻辑判断 如果shengfu这一列 是胜那么sum+1 如果是负那么sum+0 是对胜负的一个统计 我这里直接计算数值 每一行都进行计算 累加满足条件的1-200条数据。用不了这个case哦 谢谢了
Sql server 数量累计求和
以上是关于SQL累计求和的优化的主要内容,如果未能解决你的问题,请参考以下文章