首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

行列转换解决方法

2012-03-13 
行列转换测试数据编号物料类别产品编号1铅笔00012铅笔00023铅笔00031钢笔00042钢笔00051圆珠笔00072圆珠笔

行列转换
测试数据
编号       物料类别         产品编号
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


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+ ',max(case 物料类别 when ' ' '+rtrim(物料类别)+ ' ' ' then 产品编号 else 0 end) as '+rtrim(cast(物料类别 as char))+ ' ' from (select distinct 物料类别 from aa)a
set @sql=@sql+ ' from aa group by 编号 '

exec(@sql)
drop table aa
result:

编号 钢笔 铅笔 圆珠笔
----------- ----------- ----------- -----------
1 4 1 7
2 5 2 8
3 0 3 0
[解决办法]

create table T([No] char, Class varchar(100), GoodsNo varchar(10))
insert T
select '1 ', 'pencil ', '0001 '
union all
select '2 ', 'pencil ', '0002 '
union all
select '3 ', 'pencil ', '0003 '
union all
select '1 ', 'pen ', '0004 '
union all
select '2 ', 'pen ', '0005 '
union all
select '1 ', 'ballpen ', '0006 '
union all
select '2 ', 'ballpen ', '0007 '


declare @sql varchar(2000)
set @sql = 'select [No] '

select @sql = @sql + ',min(case Class when ' ' '+a.Class+ ' ' ' then GoodsNo else null end )as [ '+a.Class+ '] '
from (select distinct Class from t )a

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

exec(@sql)

drop table t


热点排行