如何用SELECT CASE将多行数据按DocNumber合并为单行?
解决方案
要实现按DocNumber分组并将对应PaymentId的金额映射到指定列的单行结果,你需要用GROUP BY对分组字段聚合,配合聚合函数提取每个分组中对应列的有效值。
修正后的SQL语句
SELECT P.DocNumber, MAX(P.DocType) AS DocType, -- 同一DocNumber下DocType一致,用MAX提取 MAX(CASE WHEN P.PaymentId = '01' THEN P.Amount END) AS Cash, MAX(CASE WHEN P.PaymentId = '02' THEN P.Amount END) AS Debit, MAX(CASE WHEN P.PaymentId = '03' THEN P.Amount END) AS Credit FROM PaymentsTable AS P GROUP BY P.DocNumber;
关键说明
GROUP BY P.DocNumber:将数据按DocNumber分组,确保每个DocNumber仅返回一行结果。MAX(CASE ...):每个分组内,对应PaymentId的CASE表达式会生成一个有效值和其他NULL值,MAX函数会自动忽略NULL,保留唯一的有效值。MAX(P.DocType):由于同一DocNumber下的DocType完全相同,用MAX可稳定提取该值(也可直接将DocType加入GROUP BY子句)。
期望结果
| DocNumber | DocType | Cash | Debit | Credit |
|---|---|---|---|---|
| 2020 | Receipt | 100.00 | 150.00 | 10.00 |
| 600 | Order | 1500.00 | NULL | NULL |
| 220 | Invoice | 650.00 | 500.00 | NULL |
内容的提问来源于stack exchange,提问作者Roy Givenchi
相关产品推荐
相关产品推荐

