问题
I am currently trying to convert a table of rows into a view of columns in an MS SQL Database. My data is currently in a table like so:
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
My results set should contain a row for each unique OID, and a column for each field in the above table. The value column should be the cell value. An example would be: (I have reduced the number of columns in this example):
OID E21FC1EC-A6D9-43E2-8C8E-0F2935A7EF68 6BBDE7FA-6F7A-4319-899B-2DF0E6610FA9 91BB8616-43CD-48EC-97CD-5813B67770ED
=== ==================================== ==================================== ====================================
13 Hello World 1
I have tried various approaches, including CASE, PIVOTS etc but I can't quite figure it out. Any solution should work with SQL Server 2005+.
Any help would be greatly appreciated.
Thanks in advance,
David
回答1:
I am writing here a good example of Dynamic Pivoting:
CREATE TABLE [dbo].[UserDetail]( [PK_User] [bigint] NOT NULL, [FK_Property] [int] NOT NULL, [PropValue] varchar NOT NULL ) ON [PRIMARY]
GO INSERT [dbo].[UserDetail] ([PK_User], [FK_Property], [PropValue]) VALUES (1, 1, N'Jitendra') INSERT [dbo].[UserDetail] ([PK_User], [FK_Property], [PropValue]) VALUES (1, 2, N'Garg') INSERT [dbo].[UserDetail] ([PK_User], [FK_Property], [PropValue]) VALUES (2, 1, N'Praveen') INSERT [dbo].[UserDetail] ([PK_User], [FK_Property], [PropValue]) VALUES (2, 2, N'Mehta') INSERT [dbo].[UserDetail] ([PK_User], [FK_Property], [PropValue]) VALUES (2, 3, N'Udaipur')
GO
ALTER PROCEDURE [dbo].[usp_Pivot] ( @UserId As INT ) As DECLARE @Query As VARCHAR(MAX)
DECLARE @StrColumn As VARCHAR(MAX) = '' SELECT @StrColumn = CASE @StrColumn WHEN '' THEN '' ELSE @StrColumn + ',' END+ 'ISNULL(['+ CAST(FK_Property AS VARCHAR(10)) +'],'''') AS Col' + CAST(FK_Property AS VARCHAR(10)) FROM dbo.UserDetail(NoLock) WHERE PK_User = @UserId
DECLARE @StrIn As VARCHAR(MAX) = '' SELECT @StrIn = CASE @StrIn WHEN '' THEN '' ELSE @StrIn + ',' END+ '['+ CAST(FK_Property AS VARCHAR(10)) +']' FROM dbo.UserDetail(NoLock) WHERE PK_User = @UserId
SET @Query = 'SELECT * FROM ( SELECT PK_User As UserId, '+ @StrColumn +' FROM ( SELECT PK_User,FK_Property,PropValue FROM dbo.UserDetail(NoLock) WHERE PK_User = ' + CAST(@UserId AS VARCHAR(10)) + ' ) p PIVOT ( MAX (PropValue) FOR FK_Property IN ('+ @StrIn +') ) AS pvt )X'
PRINT @Query EXEC (@Query) GO
You can modify this as per your requirement.....
回答2:
Try this:
http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx
来源:https://stackoverflow.com/questions/9784978/rows-to-columns-sql-server