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

比较复杂的行列转换的问题
行列转换    
  行列转换

假设有张学生成绩表(CJ)如下
Name                               型号                         适用类型     ……
微星   945P   NEO3-F       945P   NEO3-F               台式机
微星   P965   Neo-F           900                             台式机

想变成        
项                       微星   945P   NEO3-F               微星   P965   Neo-F                
型号                   945P   NEO3-F                         P965   Neo-F        
适用类型                     台式机                         台式机                  
……                           ……                                 ……
这有点类似于太平洋电脑网中的电脑对比分析。请问如何转换?


------解决方案--------------------
要是我就只会重新循环构造Datatable了
------解决方案--------------------
生成动态table
------解决方案--------------------
两个datatable进行行列互换
------解决方案--------------------
mark
------解决方案--------------------
在存储过程中用CASE,重新布局一下
------解决方案--------------------
比如:你新建一个目标结构的临时表,然后CASE条件筛选,填充新结构,输出临时表即可
------解决方案--------------------
因為數據是動態的,所以需要使用動態SQL語句。

--建立測試環境
Create Table CJ
(Name Nvarchar(100),
型号 Nvarchar(100),
适用类型 Nvarchar(50))
Insert CJ Select N '微星 945P NEO3-F ', '945P NEO3-F ', N '台式机 '
Union All Select N '微星 P965 Neo-F ', '900 ', N '台式机 '
GO
--建立存儲過程
Create ProceDure SP_TEST
As
Declare @S1 Nvarchar(4000), @S2 Nvarchar(4000)
Select @S1 = N ' Select 项 ', @S2 = ' '

Select @S1 = @S1 + ' , Max(Case Name When N ' ' '+ Name + N ' ' ' Then 项目 Else ' ' ' ' End) As [ ' + Name + '] '
From CJ Group By Name

Select @S2 = @S2 + ' Union All Select Name, N ' ' ' + Name + N ' ' ' As 项, ' + Name + N ' As 项目 From CJ '
From SySColumns Where ID = OBJECT_ID( 'CJ ') And Name != 'Name ' Order By ColID

Select @S1 = @S1 + ' From ( ' + Stuff(@S2, 1, 11, ' ') + N ') A Group By 项 '
EXEC(@S1)
GO
--測試
EXEC SP_TEST
GO
--刪除測試環境
Drop Table CJ
Drop ProceDure SP_TEST
--結果
/*
项 微星 945P NEO3-F 微星 P965 Neo-F
型号 945P NEO3-F 900
适用类型 台式机 台式机
*/