日期:2014-05-17  浏览次数:20715 次

SQL2005 如何将行转换成列
大家好!  我想将以下的数据转换成列,实在不知道怎么做,请各位帮忙指点,谢谢

目前数据

模具代码  模具名称               产品名称
S1113     PTB-403端子备模         PTB-403F-端子
S1113    PTB-403端子备模         PTB-403-端子
S1114    PTB-405端子(备模)   PTB-405F-端子
S1114    PTB-405端子(备模)   PTB-405-端子

转换后的结果是
模具代码 模具名称 产品名称A  产品名称B
S1113   PTB-403端子备模         PTB-403F-端子  PTB-403-端子
S1114   PTB-405端子(备模)   PTB-405F-端子  PTB-405-端子

该效果该如何实现

------解决方案--------------------
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + num from (SELECT CONVERT(VARCHAR,ROW_NUMBER() OVER(PARTITION BY 模具代码 ORDER BY 产品名称 )) AS num,* FROM dbo.TB)t group BY num
set @sql = '[' + @sql + ']'

exec ('select * from (select * from (SELECT CONVERT(VARCHAR,ROW_NUMBER() OVER(PARTITION BY 模具代码 ORDER BY 产品名称 )) AS num,* FROM dbo.TB)T) a pivot (max(产品名称) for num in (' + @sql + ')) b')

/*
模具代码 模具名称 1 2
S1113 PTB-403端子备模 PTB-403F-端子 PTB-403-端子
S1114 PTB-405端子(备模) PTB-405F-端子 PTB-405-端子*/


1,2自己换一下名称即可。
------解决方案--------------------
解决了干嘛不结贴.
--CREATE TABLE test (模具代码	VARCHAR(10), 模具名称  VARCHAR(20),产品名称 VARCHAR(20))
--INSERT INTO test 
--SELECT 'S1113','PTB-403端子备模','PTB-403F-端子'
--UNION ALL 
--SELECT 'S1113','PTB-403端子备模','PTB-403-端子'
--UNION ALL 
--SELECT 'S1114','PTB-405端子(备模)','PTB-405F-端子'
--UNION ALL 
--SELECT 'S1114','PTB-405端子(备模)','PTB-405-端子'

declare @s nvarchar(4000)
set @s=''
Select     @s=@s+','+'产品名称'+CASE WHEN ROW_NUMBER()OVER(ORDER BY GETDATE())=1 THEN 'A' ELSE 'B' END +'=max(case when [模具名称]='+quotename([模具名称],'''')+' then [产品名称] else ''0'' end)'
from test group BY [模具名称]
exec('select [模具代码],[模具名称]'+@s+' from test group by [模具代码],[模具名称]')

/*
模具代码       模具名称                 产品名称A                产品名称B
---------- -------------------- -------------------- --------------------
S1113      PTB-403端子备模          PTB-403-端子           0
S1114      PTB-405端子(备模)        0                    PTB-405-端子
*/