行转列的一些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

posted @ 2008-09-27 10:13 酱板猪 阅读(256) 评论(0) 编辑 收藏