读书人

sql统计语句请问

发布时间: 2014-01-05 18:22:56 作者: rapoo

sql统计语句请教?
本帖最后由 xhbmj 于 2013-12-31 17:46:07 编辑 a表(代码表)
代码id 代码名称
1 分类1
2 分类2
3 分类3

b表(数据表)
id 代码id 入库日期
1 1 2013/12-1
2 1 2013/12-7
3 2 2013/11-5
4 1 2013/11-28
5 2 2013/10-13

需要得到这样的结果:
代码名称 年月(2013)
12 11 10 9 8 7 6 5 4 3 2 1
分类1 2 1 0 0 0 0 0 0 0 0 0 0
分类2 0 1 1 0 0 0 0 0 0 0 0 0
分类3 0 0 0 0 0 0 0 0 0 0 0 0

即按分类统计当前年月往前推一年内的月份的数据量统计

如现在是2014年1月,则应该出现的月份序列为:
1 12 11 10 9 8 7 6 5 4 3 2
[解决办法]
给你个思路:
根据代码名称分组,加上 利用case when 行转列。
具体sql自己写吧。
[解决办法]

create table tb3
(id number ,
name varchar(20)
);
insert into tb3 (ID, NAME)
values (3, '分类3
');

insert into tb3 (ID, NAME)
values (2, '分类2');

insert into tb3 (ID, NAME)
values (1, '分类1
');



create table tb4
(no number ,
id number,
dt date
) ;
insert into tb4 (NO, ID, DT, ROWID)
values (4, 1, to_date('28-11-2013', 'dd-mm-yyyy'), 'AAAR88AAEAAAASPAAA');

insert into tb4 (NO, ID, DT, ROWID)
values (5, 2, to_date('13-10-2013', 'dd-mm-yyyy'), 'AAAR88AAEAAAASPAAB');

insert into tb4 (NO, ID, DT, ROWID)
values (3, 2, to_date('05-11-2013', 'dd-mm-yyyy'), 'AAAR88AAEAAAASPAAC');

insert into tb4 (NO, ID, DT, ROWID)
values (1, 1, to_date('01-12-2013', 'dd-mm-yyyy'), 'AAAR88AAEAAAASPAAD');

insert into tb4 (NO, ID, DT, ROWID)
values (2, 1, to_date('07-12-2013', 'dd-mm-yyyy'), 'AAAR88AAEAAAASPAAE');


with dd as
(select name,yf,count(yf) tj from
(
select tb3.name,to_char(tb4.dt ,'mm') as yf from tb3 left join tb4 on tb3.id=tb4.id

) ttt
group by yf ,name
)
select name ,
max(decode(yf,12,tj ,0)
)十二月 ,
max(decode(yf,11,tj ,0)
)十一月 ,
max(decode(yf,10,tj ,0)
)十月 ,
max(decode(yf,09,tj ,0)
)九月 ,
max(decode(yf,08,tj ,0)
)八月 ,
max(decode(yf,07,tj ,0)
)七月 ,
max(decode(yf,06,tj ,0)
)六月 ,
max(decode(yf,05,tj ,0)
)五月 ,
max(decode(yf,04,tj ,0)
)四月 ,
max(decode(yf,03,tj ,0)
)三月 ,
max(decode(yf,02,tj ,0)
)二月 ,
max(decode(yf,01,tj ,0)
) 一月
from dd
group by name
order by name
最后那个不知道怎么实现
[解决办法]
如果是这样 必须要用动态sql了 因为不确定当前是几月 所以标识字段别名做不到

或者在程序里面写 会简单很多

如果用存储过程 拿当前日期循环减一个月 拼接起来就行了

类似这样 别名用to_char(add_months(sysdate,-1),'mm')

select name ,
sum(decode(to_char(rq,'yyyymm'),to_char(add_months(sysdate,-0),'yyyymm'),1,0)) "1",
sum(decode(to_char(rq,'yyyymm'),to_char(add_months(sysdate,-1),'yyyymm'),1,0)) "2",
.....
from tb
group by name

读书人网 >oracle

热点推荐