老生常谈,SQL行列转换的话题(动态列)

摘要:老生常谈,SQL行列转换的话题(动态列)

在文章“老生常谈,SQL行列转换的话题”(http://www.dotblogs.com.tw/jerker/archive/2012/07/29/73691.aspx)中,点友xiebbs提出:但这不是动态列,还需要自己手动写好每列名称。针对这个问题,更改代码如下,实现动态列。

以下为SQL代码:

 

--插入基础数据1
if OBJECT_ID('table1') is not null drop table table1;
create table table1 (Date date)
insert table1 values('2011-1-1') 
insert table1 values('2011-2-1') 
insert table1 values('2011-3-1')
insert table1 values('2011-4-1') 
insert table1 values('2011-5-1') 
insert table1 values('2011-6-1') 
insert table1 values('2011-4-1') 
insert table1 values('2011-7-1') 
--插入基础数据2
 if OBJECT_ID('table2') is not null drop table table2;
create table  table2 ( item varchar(2), starttime date, Endtime date)
insert table2 values('A','2011-2-1','2011-3-16')
insert table2 values('B','2011-1-1','2011-4-20')
insert table2 values('C','2011-3-10','2011-6-1')
insert table2 values('D','2011-4-15','2011-5-1')
 --获取动态列数据(xml获取比较省事) 
declare @date varchar(max)='';
select @date = left(y,len(y)-1) from (select '['+convert(varchar(10),[date],120)+'],' from table1 group by [date] for xml path('') )as x(y)
--然后拼装SQL代码
declare @SQL varchar(max)='';
set @SQL = 'SELECT * FROM (SELECT item ,Date, starttime,endtime FROM table2 join table1 on date between starttime and Endtime) AS SourceTable ';
set @SQL = @SQL + ' PIVOT(count(Date) FOR Date IN ('+@date+')) AS PivotTable;';
--执行
execute(@SQL);
---------------运行结果------------------------------------------