能否联接两个PIVOT SQL视图实现行转列单条结果且无需重复代码?
解决方案
优化思路
你原来的冗余步骤来源于PIVOT的分组规则:PIVOT会自动将所有未指定为聚合键、转置键的列作为分组依据,源查询中包含的tran_date等值不统一的字段会导致转置后生成多余行,不需要做两次PIVOT再关联,用条件聚合即可一步完成转置+筛选,逻辑更简洁效率更高。
完整实现代码
SELECT ID, Invoice_NBR, PAYMENT_SEQ_NBR, MAX(tran_date) AS PMNT_DATE, -- 若实际表存在以下字段且同一PAYMENT_SEQ_NBR下值唯一,保留对应行即可,否则可删除 MAX(Action) AS Action, MAX(GF_COD) AS GF_COD, MAX(FEEITEM_SEQ_NBR) AS FEEITEM_SEQ_NBR, PAYMENT_METHOD, MAX(GF_FEE) AS GF_FEE, -- 按GF_L1转列汇总 SUM(CASE WHEN GF_L1 = '1008' THEN tran_Amount ELSE 0 END) AS [1008], SUM(CASE WHEN GF_L1 = '1009' THEN tran_Amount ELSE 0 END) AS [1009], SUM(CASE WHEN GF_L1 = '4710' THEN tran_Amount ELSE 0 END) AS [4710] FROM ztblMain -- 按支付流水号等公共维度分组 GROUP BY ID, Invoice_NBR, PAYMENT_SEQ_NBR, PAYMENT_METHOD -- 筛选至少2个GF_L1列合计不为0的行 HAVING (CASE WHEN SUM(CASE WHEN GF_L1 = '1008' THEN tran_Amount ELSE 0 END) <> 0 THEN 1 ELSE 0 END) + (CASE WHEN SUM(CASE WHEN GF_L1 = '1009' THEN tran_Amount ELSE 0 END) <> 0 THEN 1 ELSE 0 END) + (CASE WHEN SUM(CASE WHEN GF_L1 = '4710' THEN tran_Amount ELSE 0 END) <> 0 THEN 1 ELSE 0 END) >= 2
方案说明
- 单轮查询即可完成所有逻辑,不需要创建多个视图再关联,代码复用性更高
- 转置逻辑用条件聚合实现,比原生PIVOT灵活性更强,维度控制更精准
- 筛选逻辑直接整合在HAVING子句中,无需额外嵌套子查询,执行效率更高
- 你提供的测试表中未包含
Action/GF_COD/FEEITEM_SEQ_NBR/GF_FEE字段,若实际业务表中存在这些字段,且同一支付流水号下值统一,上述代码可直接兼容,否则根据实际业务调整取值逻辑即可。
内容的提问来源于stack exchange,提问作者Vicki
相关产品推荐
相关产品推荐

