Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2012数据透视表_Sql_Sql Server 2012_Pivot - Fatal编程技术网

SQL Server 2012数据透视表

SQL Server 2012数据透视表,sql,sql-server-2012,pivot,Sql,Sql Server 2012,Pivot,我需要创建一个在透视表中显示结果的查询 我有一个表,它会随着客户端构建状态的更改而定期更新 我们有8个阶段的建设 115购买土地 116基金会 117木材套件安装/墙板水平 118风密和水密 119第一次固定和抹灰 120最终装配 121已完成 122赎回 这是我的问题 SELECT s.ProjectStage, su.DateStageChanged, p.FK_ID As ID, s.LongDesc AS BuildType, su.FK_StageID FRO

我需要创建一个在透视表中显示结果的查询

我有一个表,它会随着客户端构建状态的更改而定期更新

我们有8个阶段的建设

  • 115购买土地
  • 116基金会
  • 117木材套件安装/墙板水平
  • 118风密和水密
  • 119第一次固定和抹灰
  • 120最终装配
  • 121已完成
  • 122赎回
这是我的问题

SELECT 
    s.ProjectStage, su.DateStageChanged, p.FK_ID As ID,
    s.LongDesc AS BuildType, su.FK_StageID  
FROM 
    [dbo].[tbl_StageUpdates] AS su
LEFT JOIN
    [dbo].[tbl_Stage] AS s ON su.FK_StageID = s.id
LEFT JOIN 
    tbl_Projects AS p ON su.FK_ProjectID = p.PK_ProjectID
WHERE 
    s.LongDesc = 'New Build'
GROUP BY 
    p.FK_ID, s.ProjectStage, su.DateStageChanged, s.LongDesc, su.FK_StageID
ORDER BY 
    su.FK_StageID ASC
ID是客户端ID我希望查询显示如下信息:

有可能吗

在此方面的任何帮助都将不胜感激


干杯

如果您只有8个阶段,您可以使用CASE…WHEN和GROUP BY归档您的预期输出。我认为它比使用PIVOT函数更具可读性。此外,它是T-SQL,并且更容易迁移到其他DBMS

SELECT 
   ID, 
   BuildType,
   MAX(CASE FK_StageID WHEN 115 THEN DateStageChanged ELSE NULL END) AS [Land Purchased],
   MAX(CASE FK_StageID WHEN 116 THEN DateStageChanged ELSE NULL END) AS [Foundations],
   MAX(CASE FK_StageID WHEN 117 THEN DateStageChanged ELSE NULL END) AS [Timber Kit Erected / Wall Plate Level],
   MAX(CASE FK_StageID WHEN 118 THEN DateStageChanged ELSE NULL END) AS [Wind & Water Tight],
   MAX(CASE FK_StageID WHEN 119 THEN DateStageChanged ELSE NULL END) AS [1st Fix & Plastering],
   MAX(CASE FK_StageID WHEN 120 THEN DateStageChanged ELSE NULL END) AS [Final Fit Out],
   MAX(CASE FK_StageID WHEN 121 THEN DateStageChanged ELSE NULL END) AS [Completed],
   MAX(CASE FK_StageID WHEN 122 THEN DateStageChanged ELSE NULL END) AS [Redeemed]
FROM
   (
    -- original query  
        SELECT 
            s.ProjectStage, su.DateStageChanged, p.FK_ID As ID,
            s.LongDesc AS BuildType, su.FK_StageID  
        FROM 
            [dbo].[tbl_StageUpdates] AS su
        LEFT JOIN
            [dbo].[tbl_Stage] AS s ON su.FK_StageID = s.id
        LEFT JOIN 
            tbl_Projects AS p ON su.FK_ProjectID = p.PK_ProjectID
        WHERE 
            s.LongDesc = 'New Build'
        GROUP BY 
            p.FK_ID, s.ProjectStage, su.DateStageChanged, s.LongDesc, su.FK_StageID
    -- original query           
   )  Data 
GROUP BY 
   ID, BuildType

嗨,楚,谢谢你抽出时间来帮助我。我使用了您建议的代码,但是没有一个ProtectStage填充了日期,我只得到空值。布局很完美,不知道为什么没有填充日期。@RustyHamster ProjectStage列的数据类型是什么?它是数字数据类型还是字符数据类型?您好,这是INT数据类型。当语句与INT数据类型比较时,您能否尝试更新CASE?我不确定我是否理解您希望我尝试的内容。我是否要将Projectstage从int转换为date?