我目前正在尝试将MS SQL数据库中的行表转换为列视图。我的数据目前在一个这样的表格中:
ID OID Field DataType Value Archived
== === ==================================== ======== ===== =========
1 13 E21FC1EC-A6D9-43E2-8C8E-0F2935A7EF68 string Hello 0
2 13 6BBDE7FA-6F7A-4319-899B-2DF0E6610FA9 string World 1
3 13 91BB8616-43CD-48EC-97CD-5813B67770ED int 1 0
4 13 A98D43C3-0A9C-4173-8ECE-29AAAE1D973E int 2 1
5 13 92BB0DFF-EEAF-4A07-A65A-C3A1E1220F60 boolean true 0
6 13 1AEE3D08-5F09-4A18-80AC-344E03F6AD7B boolean false 0
我的结果集应该为每个唯一的OID包含一行,并为上表中的每个字段包含一列。值列应为单元格值。一个例子是:(我在这个例子中减少了列的数量):
OID E21FC1EC-A6D9-43E2-8C8E-0F2935A7EF68 6BBDE7FA-6F7A-4319-899B-2DF0E6610FA9 91BB8616-43CD-48EC-97CD-5813B67770ED
=== ==================================== ==================================== ====================================
13 Hello World 1
我尝试过各种方法,包括CASE、PIVOTS等,但我不太清楚。任何解决方案都应该与SQLServer2005+配合使用。
如有任何帮助,我们将不胜感激。
提前感谢
David
我在这里写了一个动态数据透视的好例子:
创建表[dbo]。[UserDetail]([PK_User][bigint]NOT NULL,[FK_Property][int]NOT NULL,[PropValue]varchar NOT NULL)关于[初级]
转到插入[dbo]。[UserDetail]([PK_User]、[FK_Property]、[PropValue])值(1,1,N'Jitendra')插入[dbo]。[UserDetail]([PK_User],[FK_Property],[PropValue])值(1,2,N'Garg')插入[dbo]。[UserDetail]([PK_User],[FK_Property],[PropValue])VALUES(2,1,N'Praveen')插入[dbo]。[UserDetail]([PK_User]、[FK_Property],[PropValue])值(2,2,N'Mehta')插入[dbo]。[用户详细信息]([PK_User],[FK_Property],[PropValue])值(2,3,N'Udaipur')
转到
ALTER PROCEDURE[dbo]。[usp_Pivot](@UserId作为INT)作为声明@查询为VARCHAR(MAX)
在StrColumn上声明为VARCHAR(MAX)="SELECT@StrColumn=CASE@StrColumn WHEN"THEN"ELSE@StrColumn+","END+"ISNULL(["+CAST(FK_Property AS VARCHAR(10))+'],'''')AS Col'+CAST(FK_PPropertyAS VARCHAR(10))。UserDetail(NoLock)WHERE PK_User=@UserId
将StrIn声明为VARCHAR(最大值)="SELECT@StrIn=CASE@StrIn WHEN'THEN'ELSE@StrIn+','END+'['+CAST(FK_Property ASVARCHAR(10))+']'来自dbo。UserDetail(NoLock)WHERE PK_User=@UserId
SET@Query='SELECT*FROM(SELECT PK_User As UserId,'+@StrColumn+'FROM(SELECT PK_User,FK_Property,PropValue自dbo。UserDetail(NoLock)WHERE PK_User='+CAST(@UserId ASVARCHAR(10))+')p PIVOT(FK_Property IN的最大(PropValue)('+@StrIn+'))AS pvt)X'
打印@Query EXEC(@Query)GO
您可以根据自己的要求对此进行修改。。。。。
试试这个:
http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx