【问题标题】:Converting Different columns into rows in SQL Server在 SQL Server 中将不同的列转换为行
【发布时间】:2018-05-31 07:28:26
【问题描述】:

我在 SQL Server 中有需要从列转换为行的数据。现在虽然这个问题已经被问了很多,但我仍然面临一些困难,因此我想知道是否有人可以帮助我。

目前格式如下。

所需且非常有用的表格格式是:

因此,不仅需要应用 PIVOT,而且我不确定哪种 SQL 查询语法将有助于识别类型。我曾尝试将 CASE-WHEN 与 PIVOT 一起使用,但这确实会产生正确的输出。

问候!

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2012 pivot-table


    【解决方案1】:

    您可以使用如下所示的 CROSS APPLY 查询

    see working demo

    Select 
    ProjectName,
    v.*
    from t
    cross apply 
      (
       values 
        ('Plan',PlanStartDate,PlanEndDate),
        ('Actual',ActualStartDate, ActualEndDate)
      )v(type,StartDate, EndDate)
    

    【讨论】:

    • 谢谢,但没有“类型”列。需要从列名中识别类型。因此,PlanStartDate 和 PlanEndDate 的类型将为“计划”。 “实际”也是如此
    • 那么可以有很多类型的Type列数据点,这些数据点要根据其他列的名称使用约定来计算?
    • Romil N,Dhruv 的回答是正确的。他没有使用“类型”列,而是为您创建它。不错的交叉应用 unpivot 那里。
    • 这个答案真的很巧妙。您将需要为要包含的每种类型添加一个“值”列表,但这比我给您的 UNION 查询要好得多。这正是 CROSS APPLY 必须针对的情况;动态生成这些列需要一些严重(且不可靠)的操作。
    【解决方案2】:

    试试这个

      ;WITH CTE2(ProjectName,[Plan Start Date],[Plan End Date],[Actual Start Date],[Actual End Date])
       AS
        (
        SELECT 'PR-A','1/1/2006','1/4/2006','1/4/2007','1/5/2008' UNION ALL
        SELECT 'PR-B','1/1/2007','1/1/2008','4/4/2008','6/6/2008' UNION ALL
        SELECT 'PR-C','1/1/2004','1/1/2008','2/5/2001','2/2/2008'
        )
    
       SELECT Projectname, 
           'Plan'            AS [Type], 
           [Plan start date] AS [Start Date], 
           [Plan end date]   AS [End Date] 
       FROM   Cte2 
    
       UNION ALL 
    
       SELECT Projectname, 
           'Actual' AS [Type], 
           [Actual start date], 
           [Actual end date] 
       FROM   Cte2 
       ORDER  BY Projectname, 
              [Type] DESC      
    

    演示:http://rextester.com/CQEBV76844

    【讨论】:

      猜你喜欢
      • 2013-10-01
      • 1970-01-01
      • 2012-01-16
      • 2021-02-24
      • 2010-10-22
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多