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

能否联接两个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

方案说明

  1. 单轮查询即可完成所有逻辑,不需要创建多个视图再关联,代码复用性更高
  2. 转置逻辑用条件聚合实现,比原生PIVOT灵活性更强,维度控制更精准
  3. 筛选逻辑直接整合在HAVING子句中,无需额外嵌套子查询,执行效率更高
  4. 你提供的测试表中未包含Action/GF_COD/FEEITEM_SEQ_NBR/GF_FEE字段,若实际业务表中存在这些字段,且同一支付流水号下值统一,上述代码可直接兼容,否则根据实际业务调整取值逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:39:01