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

又一个竖变横的难题解决方法

2012-03-20 
又一个竖变横的难题数据如下:对象 属性名值-------------------------人姓名张三人爱好音乐人身份证431112

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

对象        属性名         值
-------------------------
人               姓名             张三
人               爱好             音乐
人               身份证         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)
爱好 班级名 班级性质 身份证 姓名
-------------------- -------------------- -------------------- -------------------- --------------------


音乐 培训1班 成人 431112198907 张三
警告: 聚合或其他 SET 操作消除了空值。

(1 行受影响)


[解决办法]
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 group by [对象] '
exec(@sql)
对象 爱好 班级名 班级性质 身份证 姓名
----- -------------------- -------------------- -------------------- -------------------- --------------------
班级 NULL 培训1班 成人 NULL NULL
人 音乐 NULL NULL 431112198907 张三
警告: 聚合或其他 SET 操作消除了空值。

(2 行受影响)

热点排行