日期:2014-05-19  浏览次数:20614 次

行列转换
测试数据
编号       物料类别         产品编号
1               铅笔                 0001
2               铅笔                 0002
3               铅笔                 0003
1               钢笔                 0004
2               钢笔                 0005
1               圆珠笔             0007
2               圆珠笔             0008
等等,其中物料类别不确定,这是一个订单的物料信息,要求实现以下效果:
编号         铅笔       钢笔     圆珠笔
1               0001       0004     0007
2               0002       0005     0008
3               0003       空           空

请问如何实现!!!!!???

------解决方案--------------------
create table T(DateClass char(7), Class varchar(10), [Count] varchar(10))
insert T
select '1 ', '铅笔 ', '0001 '
union all
select '2 ', '铅笔 ', '0001 '
union all
select '3 ', '铅笔 ', '0001 '
union all
select '1 ', '钢笔 ', '0001 '
union all
select '2 ', '钢笔 ', '0001 '
union all
select '1 ', '圆珠笔 ', '0001 '
union all
select '2 ', '圆珠笔 ', '0001 '

declare @sql varchar(2000)
set @sql = 'select DateClass '

select @sql = @sql + ',sum(case Class when ' ' '+a.Class+ ' ' ' then count else 0 end )as [ '+a.Class+ '] '
from (select distinct Class from t)a

set @sql = @sql + ' from t group by DateClass '

exec(@sql)

drop table t
------解决方案--------------------
http://blog.csdn.net/zjcxc/archive/2003/12/29/20075.aspx
------解决方案--------------------
create table T(编号 int, 物料类别 nvarchar(10), 产品编号 char(4))
insert T select 1, '铅笔 ', '0001 '
union all select 2, '铅笔 ', '0002 '
union all select 3, '铅笔 ', '0003 '
union all select 1, '钢笔 ', '0004 '
union all select 2, '钢笔 ', '0005 '
union all select 1, '圆珠笔 ', '0007 '
union all select 2, '圆珠笔 ', '0008 '

declare @sql varchar(8000)
set @sql= 'select 编号, '
select @sql=@sql+quotename(物料类别)+ '=max(case when 物料类别= '+quotename(物料类别, ' ' ' ')+ ' then 产品编号 end), ' from T group by 物料类别
select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from T group by 编号 '
exec(@sql)
------解决方案--------------------


create table aa(编号 int,物料类别 varchar(100),产品编号 char(10))
insert into aa select 1, '铅笔 ', '0001 ' union all