当前位置: 代码迷 >> Sql Server >> ,按日期列如何实现
  详细解决方案

,按日期列如何实现

热度:37   发布时间:2016-04-24 10:27:12.0
请教高手,按日期列怎么实现?
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
  相关解决方案