解决网友比较经典的SQL问题之数据查询汇总
时间:2010-12-21 来源:追索
由于原来表结构过于复杂。所以模拟一个简单的。。
person date sum t1 t2 t3 t4 t5
jack 2010-1-1 5 0 0 5 0 0
jack 2010-1-10 0 0 0 0 0 0
jack 2010-1-20 9 0 0 0 0 9
tom 2010-1-3 4 0 4 0 0 0
tom 2010-1-9 6 0 0 0 6 0
tom 2010-1-18 8 0 0 8 0 0
.................................................
t1. . .t5 最多只会有一个不为0,其余都为0、日期可以看做每天都有。
要得到
person month 1 2 3 4 ....8 9 10 .....18 19 20 ....... 31 (1.。31为日期。天、。表头应该是固定的,,不管有没有这天的数据。。)
jack 2010-1 t3 t5
tom 2010-1 t2 t4 t3
理论上应该遍历。T1..T2..T3...../..看哪个不为0.。然后取出表头。。。放新表里面。。。难点。。不会、、
这个问题难点无非就是Sql查询汇总
我随手打开了查询分析器先解决网友leoD的问题
注释之后再补上
首先先感谢leoD提出这个经典的问题
有不懂的可咨询
if object_id('zhuisuo')is not null drop table zhuisuo go create table zhuisuo ( person varchar(20) null, date datetime null, [sum] int null, t1 int null, t2 int null, t3 int null, t4 int null, t5 int null ) insert into zhuisuo values('jack','2010-1-1',5,0,0,5,0,0) insert into zhuisuo values('jack','2010-1-10',0,0,0,0,0,0) insert into zhuisuo values('jack','2010-1-20',9,0,0,0,0,9) insert into zhuisuo values('tom','2010-1-3',4,0,4,0,0,0) insert into zhuisuo values('tom','2010-1-9',6,0,0,0,6,0) insert into zhuisuo values('tom','2010-1-18',8,0,0,8,0,0) insert into zhuisuo values('tom','2010-2-18',8,0,8,0,0,0) select person,date,rq01,rq02,rq03,rq04,rq05,rq06,rq07,rq08,rq09,rq10,rq11,rq12,rq13,rq14,rq15,rq16,rq17,rq18,rq19,rq20,rq21,rq22,rq23,rq24,rq25,rq26,rq27,rq28,rq29,rq30,rq31 from(select person,left(convert(varchar(10),date,102),7) date, case when t1>0 then 't1' when t2>0 then 't2' when t3>0 then 't3' when t4>0 then 't4' when t5>0 then 't5' end as tt, 'rq'+right(convert(varchar(10),date,102),2) rq from zhuisuo) as a pivot( max(tt) for rq in([rq01],[rq02],[rq03],[rq04],[rq05],[rq06],[rq07],[rq08],[rq09],[rq10],[rq11],[rq12],[rq13],[rq14],[rq15],[rq16],[rq17],[rq18],[rq19],[rq20],[rq21],[rq22],[rq23],[rq24],[rq25],[rq26],[rq27],[rq28],[rq29],[rq30],[rq31])) as b