由于原来表结构过于复杂。所以模拟一个简单的。。
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.。然后取出表头。。。放新表里面。。。难点。。不会、、
1.这是标准的交叉查询问题
2.根据你的描述(t1. . .t5 最多只会有一个不为0,其余都为0、日期可以看做每天都有),sum = t1 + t2 + t3 + t4 + t5
下面给出1-5号的SQL语句,其它你复制补上就可以
select
[person],
[date] = convert(varchar(4),datepart(year,[date])) + '-' + convert(varchar(2),datepart(month,[date])),
1 = case when datepart(day,[date])=1 then [sum] else NULL end,
2 = case when datepart(day,[date])=2 then [sum] else NULL end,
3 = case when datepart(day,[date])=3 then [sum] else NULL end,
4 = case when datepart(day,[date])=4 then [sum] else NULL end,
5 = case when datepart(day,[date])=5 then [sum] else NULL end
from t
group by [person],
[date] = convert(varchar(4),datepart(year,[date])) + '-' + convert(varchar(2),datepart(month,[date]))