日期:2014-05-18  浏览次数:20551 次

如何使用PIVOT实现 领导工作安排表(交叉表)的输出?不用PIVOT实现都可以!!
前提: 

现在数据库内有一个table。表DirectorWeekSchedule的作用主要是记录领导需要参加的活动日期,内容,其coloum如下: 
DirectorName(领导姓名,类型:nvarchar(50)) ActionDate(活动日期,类型:DateTime) Contents(活动内容,类型:nvarchar(100)) 

以下是数据: 
李书记 2008-4-7 3:30:00 外出开会  
李书记 2008-4-8 3:30:00 党委会议 
李书记 2008-4-9 3:30:00 审批文件 
李书记 2008-4-10 3:30:00 办公室调研 
陈校长 2008-4-7 3:30:00 审批文件 
陈校长 2008-4-8 3:30:00 办公室调研 
陈校长 2008-4-9 3:30:00 审批文件 
李书记 2008-4-11 3:30:00 办公室调研 
陈校长 2008-4-10 3:30:00 审批文件 
陈校长 2008-4-11 3:30:00 办公室调研 


问题: 

那现在我想通过PIVOT实现对这个表进行行列转换。转换后的样式如下: 

领导名 4月7号 ¦ 4月8号 ¦ 4月9号 ¦ 4月10号 ¦ 4月11号 
---------------------------------- 
李书记 外出开会 ¦ 党委会议 ¦ 审批文件 ¦ 办公室调研 ¦ 办公室调研 
---------------------------------- 
陈校长 审批文件 ¦ 办公室调研 ¦ 审批文件 ¦ 审批文件 ¦ 办公室调研 

那我应该怎样写SQL语句呢? 


ps:1.大家注意了由于这个表是领导工作日程表,所以表的第一列的日期每周都会更换的,不是固定不变的。 那如何实现每隔一周,就更新那个表头呢?
   
  2.我有查过msdn,以及网上的一些pivot的教程,但依然不能解决我的问题。首先他们的说明都是上面第一行内容是固定不变的,而我需要定期 

改变的;第二,我有些部分看不懂,特别是 在内嵌套select语句后,他们都写了一个p或者ps的字,然后才PIVOT的。而且最后还有写上AS pt,为什 

么还要改名呢?但表中就没有这个pt的列的喔!! 

有问题的sql语句举例: 
SELECT Category, South, NorthEast, MidWest, West 
FROM (Select Category, Region, Amount from RawData)  

sq(????) 

PIVOT 
(Sum (Amount) 
FOR Region IN (South, NorthEast, MidWest, West) 
) AS pt(?????) 
   
  3.我看过大部分的教程在使用PIVOT的时候都用上了聚集函数,但我的输出内容是字符串,怎么可能用聚集函数呢?那么它应该用什么函数来聚集然后输出呢? 

  4.目前我想到能够动态输出日期的方法如下: 

  case ActionDate  
  when DATEDIFF ( wk , ActionDate ,GETDATE() )=0 AND DATENAME ( d , ActionDate )=1 then ActionDate 
  对actionDate做一个判断,然后符合上述case语句判断要求的话,就输出为星期一,处理其他日子方法同理。 
  但研究发现不成功,查询分析器会报错,不能实现这样的动态生成列名!


------解决方案--------------------
SQL code
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (DirectorName varchar(11),ActionDate datetime,Contents varchar(10))
insert into #T
select '李书记','2008-4-7 3:30:00','外出开会' union all
select '李书记','2008-4-8 3:30:00','党委会议' union all
select '李书记','2008-4-9 3:30:00','审批文件' union all
select '李书记','2008-4-10 3:30:00','办公室调研' union all
select '陈校长','2008-4-7 3:30:00','审批文件' union all
select '陈校长','2008-4-8 3:30:00','办公室调研' union all
select '陈校长','2008-4-9 3:30:00','审批文件' union all
select '李书记','2008-4-11 3:30:00','办公室调研' union all
select '陈校长','2008-4-10 3:30:00','审批文件' union all
select '陈校长','2008-4-11 3:30:00','办公室调研'

select * from
    (select DirectorName,Date=convert(varchar(10),ActionDate,120), Contents from #T) as a
pivot
    (max(Contents) for date in ([2008-04-07],[2008-04-08],[2008-04-09],[2008-04-10],[2008-04-11])) as b