在SQL Server中将不同的列转换为行

在SQL Server中将不同的列转换为行,sql,sql-server,sql-server-2008,sql-server-2012,pivot-table,Sql,Sql Server,Sql Server 2008,Sql Server 2012,Pivot Table,我在SQL Server中有需要从列转换为行的数据。现在,虽然这个问题已经被问了很多次,但我仍然面临一些困难,因此我想知道是否有人可以帮助我 目前格式如下 所需的表格格式以及非常有用的表格格式如下: 因此,不仅需要应用PIVOT,而且我不确定哪种SQL查询语法将有助于识别类型。我曾尝试将CASE-WHEN与PIVOT结合使用,但这确实产生了正确的输出 问候 您可以使用如下交叉应用查询 试试这个 ;WITH CTE2(ProjectName,[Plan Start Date],[Plan

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

目前格式如下

所需的表格格式以及非常有用的表格格式如下:

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


问候

您可以使用如下交叉应用查询

试试这个

  ;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      


演示:

谢谢,但没有“类型”栏。需要从列名中标识类型。因此,PlanStartDate和PlanEndDate的类型将为“Plan”。“实际”也是如此,因此可以有许多类型的
Type
列数据点,这些数据点可以使用约定从其他列的名称计算出来?Romil N,Dhruv的答案是正确的。他不是在使用“类型”列,而是在为您创建它。很好的十字交叉。这个答案很巧妙。您需要为要包含的每种类型添加“值”列表,但这比我提供的联合查询要好得多。这正是交叉应用的设计目的;动态生成这些列需要一些严重(而且不可靠)的蒙骗。
  ;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