You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中如何将列值转为新列实现付款状态行转列

SQL Server 付款状态宽表查询实现

源表信息

存储付款状态变更历史的源表字段如下:

  • contractID:合同唯一标识
  • paymentID:付款单唯一标识
  • paymentStatus:付款状态,可选值包括Received、Approved、Processed
  • statusDate:对应状态的生效日期

业务规则:单组(contractID, paymentID)的标准状态流转顺序为Received -> Approved -> Processed,源数据可能存在部分状态缺失,缺失状态对应的日期字段需返回NULL。

目标输出

每个(contractID, paymentID)返回唯一一行,字段为:

  • contractID
  • paymentID
  • statusDateOfReceived:Received状态对应的日期
  • statusDateOfApproved:Approved状态对应的日期
  • statusDateOfProcessed:Processed状态对应的日期

查询代码

使用条件聚合实现,写法简洁兼容性强,替换代码中的表名为实际表名即可执行:

SELECT
    contractID,
    paymentID,
    MAX(CASE WHEN paymentStatus = 'Received' THEN statusDate END) AS statusDateOfReceived,
    MAX(CASE WHEN paymentStatus = 'Approved' THEN statusDate END) AS statusDateOfApproved,
    MAX(CASE WHEN paymentStatus = 'Processed' THEN statusDate END) AS statusDateOfProcessed
FROM YourPaymentHistoryTableName
GROUP BY contractID, paymentID;

逻辑说明

  • 按contractID、paymentID分组,确保每组合同付款组合只输出一行
  • CASE语句对每条记录做状态匹配,匹配到目标状态时返回对应statusDate,未匹配则返回NULL
  • 用MAX做聚合取值:如果同一状态存在多条重复记录(异常数据场景),会自动取最新的日期;如果分组内完全没有对应状态的记录,聚合结果为NULL,符合缺失状态返回空值的要求

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:18:41