又一个竖变横的难题
数据如下:
对象 属性名 值
-------------------------
人 姓名 张三
人 爱好 音乐
人 身份证 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 行受影响)