+ -
当前位置:首页 → 问答吧 → 请教一个SQL语句,自动为没有数据的月份填0

请教一个SQL语句,自动为没有数据的月份填0

时间:2011-12-27

来源:互联网

原始数据如下:
分组 时间 金额
A 20110706 100
A 20110711 200
A 20110712 100
A 20110719 400
A 20110801 100
A 20110809 540
A 20110826 160
A 20111006 190
A 20111007 210
A 20111012 109

时间字段前四位为年,中间两位为月,最后两位为日

要求得到的数据为按月份汇总的数据,没有数据的月份自动填0,结果如下:
分组 月份 金额
A 01 0
A 02 0
A 03 0
A 04 0
A 05 0
A 06 0
A 07 800
A 08 800
A 09 0
A 10 509
A 11 0
A 12 0

用一条sql语句能否实现?

作者: yugang1219   发布时间: 2011-12-27

分组,还有B的情况吗?还是只有A这种情况

作者: realliguangyu82   发布时间: 2011-12-27

没有11年之前的数据吗?

作者: lxpbs8851   发布时间: 2011-12-27

分组有可能有B的情况,11年之前的数据也有,我只是简化了,主要是不知道怎么自动为没有数据的月份填0

作者: yugang1219   发布时间: 2011-12-27

SQL code

select b.分组 ,to_char(b.时间,'yyyymm') as 月份,sum(nvl(b.金额,0)) as 金额
from 
(SELECT to_char(TO_DATE('20110101','yyyymmdd' ) +LEVEL - 1,'yyyymmdd') as dt
FROM DUAL
CONNECT BY LEVEL <=
TRUNC(TO_DATE('20120101', 'yyyymmdd')-TO_DATE('20110101', 'yyyymmdd')) + 1 ) a left join tab b on a.dt=b.to_char(时间,'yyyymmdd')
group by b.分组 ,to_char(b.时间,'yyyymm')

作者: lxpbs8851   发布时间: 2011-12-27

SQL code

select b.分组 ,to_char(b.时间,'yyyymm') as 月份,sum(nvl(b.金额,0)) as 金额
from 
(SELECT to_char(TO_DATE('20110101','yyyymmdd' ) +LEVEL - 1,'yyyymmdd') as dt
FROM DUAL
CONNECT BY LEVEL <=
TRUNC(TO_DATE('20120101', 'yyyymmdd')-TO_DATE('20110101', 'yyyymmdd')) + 1 ) a left join tab b on a.dt=to_char(b.时间,'yyyymmdd')
group by b.分组 ,to_char(b.时间,'yyyymm')

作者: lxpbs8851   发布时间: 2011-12-27

SQL code

select substr(a.dt,1,4) as 月份,sum(nvl(b.金额,0)) as 金额
from 
(SELECT to_char(TO_DATE('20110101','yyyymmdd' ) +LEVEL - 1,'yyyymmdd') as dt
FROM DUAL
CONNECT BY LEVEL <=
TRUNC(TO_DATE('20120101', 'yyyymmdd')-TO_DATE('20110101', 'yyyymmdd')) + 1 ) a left join tab b on a.dt=to_char(b.时间,'yyyymmdd')
group by substr(a.dt,1,4)

作者: lxpbs8851   发布时间: 2011-12-27

SELECT 分组,substr(时间,5,2) 月份,nvl(sum(金额),0) 金额
FROM tb
group by substr(时间,5,2);

作者: cutebear2008   发布时间: 2011-12-27

SQL code
select 'A' 分组,t1.rn 月份,nvl(s,0) 金额 from
(select lpad(rownum,2,'0') rn from dual connect by rownum<=12)t1
,
(select substr(to_char(时间,'YYYYMMDD'),5,2) rn ,sum(金额) s from tb 
group by substr(to_char(时间,'YYYYMMDD'),5,2))t2
where t1.rn=t2.rn(+) order by t1.rn

作者: xpingping   发布时间: 2011-12-27