日期:2014-05-18  浏览次数:20497 次

又一个竖变横的难题
数据如下:

对象        属性名         值
-------------------------
人               姓名             张三
人               爱好             音乐
人               身份证         431112198907
班级           班级名         培训1班
班级           班级性质     成人
……           ……             ……(数据太多,省略)

我想要的结果是:
当我查找对象名为“人”时显示:

人姓名       爱好       身份证
----------------------------
张三           音乐       431112198907
……           ……       ……


当查找的对象名为“班级”时显示:

班级名         班级性质
------------------
培训1班       成人
……             ……


        为了获得更大的灵活性,每个对象的属性数量并不相同,人有三个属性,班级只有两个属性,查找不同的对象名时显示不同的列数,该怎么实现呢?以及如何才能竖变横呢?
        当然真实的数据库不会如此“不堪入目”,这些数据只是个例子:)
        先谢谢大家

------解决方案--------------------
--建立測試環境
Create Table TEST
(对象 Nvarchar(20),
属性名 Nvarchar(50),
值 Nvarchar(100))
Insert TEST Select N '人 ', N '姓名 ', N '张三 '
Union All Select N '人 ', N '爱好 ', N '音乐 '
Union All Select N '人 ', N '身份证 ', N '431112198907 '
Union All Select N '班级 ', N '班级名 ', N '培训1班 '
Union All Select N '班级 ', N '班级性质 ', N '成人 '
GO
--建立存儲過程
Create Procedure SP_TEST(@Object Nvarchar(20))
As
Begin
Declare @S Nvarchar(4000)
Select @S = N ' Select 对象 '
Select @S = @S + N ', Max(Case 属性名 When N ' ' ' + 属性名 + N ' ' ' Then 值 Else ' ' ' ' End) As [ ' + 属性名 + '] '
From TEST Where 对象 = @Object Group By 属性名
Select @S = @S + N ' From TEST Where 对象 = N ' ' ' + @Object + N ' ' ' Group By 对象 '
EXEC(@S)
End
GO
--測試
EXEC SP_TEST N '人 '
EXEC SP_TEST N '班级 '
GO
--刪除測試環境
Drop Table TEST
Drop Procedure SP_TEST
--結果
/*
对象 身份证 姓名 爱好
人 431112198907 张三 音乐

对象 班级名 班级性质
班级 培训1班 成人
*/

------解决方案--------------------
create table ta([对象] varchar(5),[属性名] varchar(10), [值] varchar(20))
insert ta select '人 ', '姓名 ', '张三 '
union all select '人 ', '爱好 ', '音乐 '
union all select '人 ', '身份证 ', '431112198907 '
union all select '班级 ', '班级名 ', '培训1班 '
union all select '班级 ', '班级性质 ', '成人 '

declare @sql varchar(4000)
select @sql=isnull(@sql+ ', ', ' ')+quotename([属性名])+ '= max(case [属性名] when '+quotename([属性名], ' ' ' ')+
' then [值] end) '
from ta
group by [属性名]
set @sql= 'select '+@sql+ ' from ta '
exec(@sql)
爱好 班级名 班级性质 身份证 姓名
--------------------