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

如何横向合并两个SQL查询结果并添加行列汇总?

可行的替代实现方法

针对你的需求——横向合并两个查询结果、添加行级总计列和列级汇总行,以下是几种替代方案:

方法1:使用ROLLUP生成列级汇总 + 行级计算列

如果你的SQL引擎支持ROLLUP(如Snowflake、BigQuery、PostgreSQL 11+),可以先关联两个查询的结果,再用ROLLUP自动生成汇总行,同时直接计算行级总计:

WITH combined_data AS (
    -- 关联两个查询的结果
    SELECT
        q1.CUST_TYPE,
        q1.SCV_COMPENSATABLE_BALANCE,
        q2.BENEFICIARY_FUNDS,
        q2.FUNDS_UNDER_DISPUTE,
        q2.DORMANT_ACCOUNTS_X_20PC,
        -- 计算行级总计列
        q1.SCV_COMPENSATABLE_BALANCE + q2.BENEFICIARY_FUNDS + q2.FUNDS_UNDER_DISPUTE + q2.DORMANT_ACCOUNTS_X_20PC AS "TOTAL FSCS Compensation Limit Utilization"
    FROM (
        -- 简化后的查询1:去重后按CUST_TYPE求和
        SELECT
            CUST_TYPE,
            SUM(CUST_COMPENSATABLE_AMT) AS SCV_COMPENSATABLE_BALANCE
        FROM (
            SELECT
                CUST_TYPE,
                FSA_UNIQUE_REF_NO,
                CUST_COMPENSATABLE_AMT,
                ROW_NUMBER() OVER (PARTITION BY CUST_TYPE, FSA_UNIQUE_REF_NO ORDER BY CUST_TYPE) AS rank1
            FROM ddewd10s.FSCS_LIMIT_UTIL_SCV
            QUALIFY rank1 = 1
        ) A
        GROUP BY CUST_TYPE
    ) q1
    FULL JOIN (
        -- 查询2保持原样
        SELECT
            CUST_TYPE,
            Sum(CUST_BENEFICIARY_FUNDS) AS BENEFICIARY_FUNDS,
            Sum(CUST_FNDS_UNDR_DISPT_AMT) AS FUNDS_UNDER_DISPUTE,
            Sum(TWENTY_PCT_CUST_DOR_AMT) AS DORMANT_ACCOUNTS_X_20PC
        FROM ddewd10s.FSCS_LIMIT_UTIL
        WHERE DUPLICATE_URN = ''
        GROUP BY CUST_TYPE
    ) q2 ON q1.CUST_TYPE = q2.CUST_TYPE
)
-- 用ROLLUP生成汇总行
SELECT
    COALESCE(CUST_TYPE, 'TOTAL') AS CUST_TYPE,
    SUM(SCV_COMPENSATABLE_BALANCE) AS SCV_COMPENSATABLE_BALANCE,
    SUM(BENEFICIARY_FUNDS) AS BENEFICIARY_FUNDS,
    SUM(FUNDS_UNDER_DISPUTE) AS FUNDS_UNDER_DISPUTE,
    SUM(DORMANT_ACCOUNTS_X_20PC) AS DORMANT_ACCOUNTS_X_20PC,
    SUM("TOTAL FSCS Compensation Limit Utilization") AS "TOTAL FSCS Compensation Limit Utilization"
FROM combined_data
GROUP BY ROLLUP(CUST_TYPE)
ORDER BY CASE WHEN CUST_TYPE = 'TOTAL' THEN 1 ELSE 0 END, CUST_TYPE;

优势:利用SQL内置的ROLLUP语法,避免手动拼接汇总行,代码更简洁易维护。


方法2:CTE封装基础数据 + 手动添加汇总行

如果你的SQL引擎不支持ROLLUP,可以用CTE先处理基础关联数据,再单独计算汇总行,最后用UNION ALL合并:

WITH combined_data AS (
    SELECT
        q1.CUST_TYPE,
        q1.SCV_COMPENSATABLE_BALANCE,
        q2.BENEFICIARY_FUNDS,
        q2.FUNDS_UNDER_DISPUTE,
        q2.DORMANT_ACCOUNTS_X_20PC,
        q1.SCV_COMPENSATABLE_BALANCE + q2.BENEFICIARY_FUNDS + q2.FUNDS_UNDER_DISPUTE + q2.DORMANT_ACCOUNTS_X_20PC AS "TOTAL FSCS Compensation Limit Utilization"
    FROM (
        SELECT
            CUST_TYPE,
            SUM(CUST_COMPENSATABLE_AMT) AS SCV_COMPENSATABLE_BALANCE
        FROM (
            SELECT
                CUST_TYPE,
                FSA_UNIQUE_REF_NO,
                CUST_COMPENSATABLE_AMT,
                ROW_NUMBER() OVER (PARTITION BY CUST_TYPE, FSA_UNIQUE_REF_NO ORDER BY CUST_TYPE) AS rank1
            FROM ddewd10s.FSCS_LIMIT_UTIL_SCV
            QUALIFY rank1 = 1
        ) A
        GROUP BY CUST_TYPE
    ) q1
    FULL JOIN (
        SELECT
            CUST_TYPE,
            Sum(CUST_BENEFICIARY_FUNDS) AS BENEFICIARY_FUNDS,
            Sum(CUST_FNDS_UNDR_DISPT_AMT) AS FUNDS_UNDER_DISPUTE,
            Sum(TWENTY_PCT_CUST_DOR_AMT) AS DORMANT_ACCOUNTS_X_20PC
        FROM ddewd10s.FSCS_LIMIT_UTIL
        WHERE DUPLICATE_URN = ''
        GROUP BY CUST_TYPE
    ) q2 ON q1.CUST_TYPE = q2.CUST_TYPE
),
summary_row AS (
    SELECT
        'TOTAL' AS CUST_TYPE,
        SUM(SCV_COMPENSATABLE_BALANCE) AS SCV_COMPENSATABLE_BALANCE,
        SUM(BENEFICIARY_FUNDS) AS BENEFICIARY_FUNDS,
        SUM(FUNDS_UNDER_DISPUTE) AS FUNDS_UNDER_DISPUTE,
        SUM(DORMANT_ACCOUNTS_X_20PC) AS DORMANT_ACCOUNTS_X_20PC,
        SUM("TOTAL FSCS Compensation Limit Utilization") AS "TOTAL FSCS Compensation Limit Utilization"
    FROM combined_data
)
SELECT * FROM combined_data
UNION ALL
SELECT * FROM summary_row
ORDER BY CASE WHEN CUST_TYPE = 'TOTAL' THEN 1 ELSE 0 END, CUST_TYPE;

优势:兼容性极强,几乎所有SQL引擎都支持,逻辑清晰,便于自定义汇总规则。


方法3:子查询嵌套 + 窗口函数生成汇总列

可以用窗口函数一次计算全局汇总值,再将汇总值作为单独行输出,同时保留行级总计:

SELECT
    CUST_TYPE,
    SCV_COMPENSATABLE_BALANCE,
    BENEFICIARY_FUNDS,
    FUNDS_UNDER_DISPUTE,
    DORMANT_ACCOUNTS_X_20PC,
    "TOTAL FSCS Compensation Limit Utilization"
FROM (
    SELECT
        q1.CUST_TYPE,
        q1.SCV_COMPENSATABLE_BALANCE,
        q2.BENEFICIARY_FUNDS,
        q2.FUNDS_UNDER_DISPUTE,
        q2.DORMANT_ACCOUNTS_X_20PC,
        q1.SCV_COMPENSATABLE_BALANCE + q2.BENEFICIARY_FUNDS + q2.FUNDS_UNDER_DISPUTE + q2.DORMANT_ACCOUNTS_X_20PC AS "TOTAL FSCS Compensation Limit Utilization"
    FROM (
        SELECT
            CUST_TYPE,
            SUM(CUST_COMPENSATABLE_AMT) AS SCV_COMPENSATABLE_BALANCE
        FROM (
            SELECT
                CUST_TYPE,
                FSA_UNIQUE_REF_NO,
                CUST_COMPENSATABLE_AMT,
                ROW_NUMBER() OVER (PARTITION BY CUST_TYPE, FSA_UNIQUE_REF_NO ORDER BY CUST_TYPE) AS rank1
            FROM ddewd10s.FSCS_LIMIT_UTIL_SCV
            QUALIFY rank1 = 1
        ) A
        GROUP BY CUST_TYPE
    ) q1
    FULL JOIN (
        SELECT
            CUST_TYPE,
            Sum(CUST_BENEFICIARY_FUNDS) AS BENEFICIARY_FUNDS,
            Sum(CUST_FNDS_UNDR_DISPT_AMT) AS FUNDS_UNDER_DISPUTE,
            Sum(TWENTY_PCT_CUST_DOR_AMT) AS DORMANT_ACCOUNTS_X_20PC
        FROM ddewd10s.FSCS_LIMIT_UTIL
        WHERE DUPLICATE_URN = ''
        GROUP BY CUST_TYPE
    ) q2 ON q1.CUST_TYPE = q2.CUST_TYPE
) base
-- 合并原始行和汇总行
UNION ALL
SELECT
    'TOTAL' AS CUST_TYPE,
    SUM(SCV_COMPENSATABLE_BALANCE),
    SUM(BENEFICIARY_FUNDS),
    SUM(FUNDS_UNDER_DISPUTE),
    SUM(DORMANT_ACCOUNTS_X_20PC),
    SUM("TOTAL FSCS Compensation Limit Utilization")
FROM (
    SELECT
        q1.CUST_TYPE,
        q1.SCV_COMPENSATABLE_BALANCE,
        q2.BENEFICIARY_FUNDS,
        q2.FUNDS_UNDER_DISPUTE,
        q2.DORMANT_ACCOUNTS_X_20PC,
        q1.SCV_COMPENSATABLE_BALANCE + q2.BENEFICIARY_FUNDS + q2.FUNDS_UNDER_DISPUTE + q2.DORMANT_ACCOUNTS_X_20PC AS "TOTAL FSCS Compensation Limit Utilization"
    FROM (
        SELECT
            CUST_TYPE,
            SUM(CUST_COMPENSATABLE_AMT) AS SCV_COMPENSATABLE_BALANCE
        FROM (
            SELECT
                CUST_TYPE,
                FSA_UNIQUE_REF_NO,
                CUST_COMPENSATABLE_AMT,
                ROW_NUMBER() OVER (PARTITION BY CUST_TYPE, FSA_UNIQUE_REF_NO ORDER BY CUST_TYPE) AS rank1
            FROM ddewd10s.FSCS_LIMIT_UTIL_SCV
            QUALIFY rank1 = 1
        ) A
        GROUP BY CUST_TYPE
    ) q1
    FULL JOIN (
        SELECT
            CUST_TYPE,
            Sum(CUST_BENEFICIARY_FUNDS) AS BENEFICIARY_FUNDS,
            Sum(CUST_FNDS_UNDR_DISPT_AMT) AS FUNDS_UNDER_DISPUTE,
            Sum(TWENTY_PCT_CUST_DOR_AMT) AS DORMANT_ACCOUNTS_X_20PC
        FROM ddewd10s.FSCS_LIMIT_UTIL
        WHERE DUPLICATE_URN = ''
        GROUP BY CUST_TYPE
    ) q2 ON q1.CUST_TYPE = q2.CUST_TYPE
) summary
ORDER BY CASE WHEN CUST_TYPE = 'TOTAL' THEN 1 ELSE 0 END, CUST_TYPE;

优势:通过窗口函数一次性计算所有汇总值,避免重复关联基础表,适合数据量较大的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:00:52