行转列的一些SQL语句
的格式如下
日期 客户 销售数量
20061001 家乐福 200
20061002 上好佳 300
20061003 赠品 400
20061103 家乐新店 500
20061105 北乐小店 600
20061106 家乐福 200
20061006 北乐小店 200
20061107 赠品 400
现在生成如下格式:
客户 200610 200611
家乐福 200 200
--创建动态SQL
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',[ '+rtrim(num)+ ']=max(case num when '+rtrim(num)+ ' then 销售数量 end) '
from (select Left(convert(varchar,日期,112),6) as Num from t a) b
group by num order by num
set @sql= 'select 客户 '+@sql+ ' from (select a.*,Left(convert(varchar,日期,112),6) as Num from t a) b group by b.客户 '
exec(@sql)
go
完整的测试例子
--日期字段為字符串類型時
create table T(日期 varchar(10), 客户 varchar(10), 销售数量 int)
insert T select '20061001 ', '家乐福 ', 200
union all select '20061002 ', '上好佳 ', 300
union all select '20061003 ', '赠品 ', 400
union all select '20061103 ', '家乐新店 ', 500
union all select '20061105 ', '北乐小店 ', 600
union all select '20061106 ', '家乐福 ', 200
union all select '20061006 ', '北乐小店 ', 200
union all select '20061107 ', '赠品 ', 400
declare @sql varchar(8000)
set @sql= 'select 客户, '
select @sql=@sql+quotename(日期)+ '=sum(case when left(日期, 6)= '+quotename(日期, ' ' ' ')+ ' then 销售数量 else 0 end), '
from (
select 日期=left(日期, 6) from T group by left(日期, 6)
)tmp
select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from T group by 客户 '
exec(@sql)
--result
客户 200610 200611
---------- ----------- -----------
北乐小店 200 600
家乐福 200 200
家乐新店 0 500
上好佳 300 0
赠品 400 400

