table1
ID 姓名
1 张三
2 李四
3 王五
table2
ID 姓名 日期 动态
1 张三 2014/01/01 08:00:00 上班
2 张三 2014/01/01 14:00:00 外出
3 李四 2014/01/01 08:00:00 上班
4 张三 2014/01/02 08:00:00 上班
5 张三 2014/01/03 08:00:00 上班
想要的结果是:
姓名 1 2 3 ………31
张三 外出 上班 上班
李四 上班 未知 未知
王五 未知 未知 未知
求指定一个月份的每个人每天在干什么,每天的动态以最后一条记录为准,按姓名成行按日期成列
------解决方案--------------------
先row_number() over(partition by 年月日 order by 日期 desc ),
max(case when day(日期)=1 and 上面排序=1 then '动态' else '未知' end
写一堆即可
------解决方案--------------------
DECLARE @sql VARCHAR(8000)
SET @sql='select [name]'
SELECT @sql=@sql+',max(case [date] when '''+[date]+''' then [status] else 未知 end )['+[status]+']'
FROM (SELECT DISTINCT [date] FROM tab )a
SET @sql=@sql+' from tab group by [name]'
EXEC (@sql)
------解决方案--------------------
sorry,3楼代码有bug,修正如下,
create table table1
(ID int,姓名 varchar(10))
insert into table1
select 1,'张三' union all
select 2,'李四' union all
select 3,'王五'
create table table2
(ID int,姓名 varchar(10),日期 datetime,动态 varchar(10))
insert into table2
select 1,'张三','2014/01/01 08:00:00','上班' union all
select 2,'张三','2014/01/01 14:00:00','外出' union all
select 3,'李四','2014/01/01 08:00:00','上班' union all
select 4,'张三','2014/01/02 08:00:00','上班' union all
select 5,'张三','2014/01/03 08:00:00','上班'
declare @y int,@m int
select @y=2014,
@m=1 -- 指定一个月份
declare @tsql varchar(8000),@t varchar(8000)
select @tsql=isnull(@tsql+',','')+'['+rtrim(number)+']',
@t=isnull(@t+',','')+'isnull(['+rtrim(number)+'],''未知'') '''+rtrim(number)+''' '
from master.dbo.spt_values
where type='P'
and number between 1 and datepart(d,dateadd(d,-1,dateadd(m,1,rtrim(@y)+'-'+rtrim(@m)+'-01')))
select @tsql='
select 姓名,'+@t+'
from
(select b.ID,b.姓名,a.动态,a.日期
from table1 b
left join
(select 姓名,动态,日期
from
(select 姓名,动态,datepart(d,日期) ''日期'',
row_number() over(partition by 姓名,convert(varchar,日期,23)
order by 日期 desc) ''rn''
from table2
where year(日期)='+rtrim(@y)+' and month(日期)='+rtrim(@m)+') t
where rn=1) a on b.姓名=a.姓名) c
pivot(max(动态) for 日期 in('+@tsql+')) p
order by ID '
exec(@tsql)
/*
姓名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31