SQL Server 2012 数据透视表

3
我需要创建一个查询,以在数据透视表中显示结果。
我有一个表格,定期更新客户构建状态更改。
我们有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,我想要的是将查询结果展示成这样:

enter image description here

这个有可能实现吗?

非常感谢您的帮助!

谢谢!

1个回答

2
如果您只有8个阶段,您可以使用CASE...WHENGROUP 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

嗨Trung,感谢你抽出时间来帮助我。我已经使用了你建议的代码,但是ProtectStages中没有一个填充有日期,我只得到了NULL值。布局很完美,不确定为什么日期没有被填充。 - RustyHamster
@RustyHamster 请问ProjectStage列的数据类型是什么?它是数字数据类型还是字符数据类型? - Trung Duong
嗨Trung,这是一个INT数据类型。 - RustyHamster
我不确定我理解你想让我尝试什么。我是要将Projectstage从int转换为date吗? - RustyHamster
嗨Trung,我现在遇到了一个错误 将varchar值“Land Purchased”转换为数据类型int时转换失败。 - RustyHamster
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接