【问题标题】:Rows to Columns SQL Server行到列 SQL Server
【发布时间】:2012-03-20 10:26:50
【问题描述】:

我目前正在尝试将行表转换为 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 等,但我不太明白。任何解决方案都应该适用于 SQL Server 2005+。

任何帮助将不胜感激。

提前致谢,

大卫

【问题讨论】:

  • "已经尝试了各种方法,包括 CASE、PIVOTS" - 建议您发布尝试。
  • @DavidMuir:你试过在 SSRS 中使用矩阵吗?
  • 旋转可能是要走的路。加快数据透视表速度的最简单方法是使用 Excel。创建一个带有列标题标签的常规表格,并使用位于数据菜单下的数据透视表向导来帮助您制作各种数据透视表。 MS Access 有一种方法可以调用内置于其中的 Excel 数据透视表工具,因此从关系表开始并制作数据透视表很容易。我不知道 MS SQL。

标签: sql sql-server sql-server-2008 sql-server-2005 tsql


【解决方案1】:

我在这里写了一个很好的动态透视示例:

创建表 [dbo].[UserDetail]( [PK_User] [bigint] NOT NULL, [FK_Property] [int] NOT NULL, [PropValue] varchar NOT NULL) 在 [主要]

GO INSERT [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]) 值 (2, 1、N'Praveen') INSERT [dbo].[UserDetail] ([PK_User], [FK_Property], [PropValue]) 值 (2, 2, N'Mehta') 插入 [dbo].[UserDetail] ([PK_User], [FK_Property], [PropValue]) VALUES (2, 3, N'Udaipur')

ALTER PROCEDURE [dbo].[usp_Pivot] (@UserId As INT) 作为 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 '' 那么 '' 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'

打印@Query EXEC (@Query) GO

您可以根据自己的需要进行修改.....

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 2023-02-08
    • 2013-09-10
    • 1970-01-01
    • 2015-10-02
    • 2021-08-02
    相关资源
    最近更新 更多