Rows to Columns SQL Server

雨燕双飞 提交于 2019-12-25 01:39:20

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!