比较复杂的行列转换的问题
行列转换
行列转换
假设有张学生成绩表(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
适用类型 台式机 台式机
*/