SQL Server中如何将列值转为新列实现付款状态行转列
SQL Server 付款状态宽表查询实现
源表信息
存储付款状态变更历史的源表字段如下:
contractID:合同唯一标识paymentID:付款单唯一标识paymentStatus:付款状态,可选值包括Received、Approved、ProcessedstatusDate:对应状态的生效日期
业务规则:单组(contractID, paymentID)的标准状态流转顺序为Received -> Approved -> Processed,源数据可能存在部分状态缺失,缺失状态对应的日期字段需返回NULL。
目标输出
每个(contractID, paymentID)返回唯一一行,字段为:
contractIDpaymentIDstatusDateOfReceived: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
相关产品推荐
相关产品推荐

