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

如何在Snowflake SQL中实现Oracle的二维FOR子句透视?

Oracle透视查询适配Snowflake与T-SQL方案

原Oracle PL/SQL透视查询因Snowflake不支持多列透视键、聚合后别名后缀等特性无法直接运行,以下是等价实现:

Snowflake SQL 实现

SELECT 
    RACE,
    COUNT(CASE WHEN GENDER = 'Male' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) AS MNH_G,
    COUNT(CASE WHEN GENDER = 'Female' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) AS FNH_G,
    COUNT(CASE WHEN GENDER = 'Unknown' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) AS UNH_G,
    COUNT(CASE WHEN GENDER = 'Male' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) AS MH_G,
    COUNT(CASE WHEN GENDER = 'Female' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) AS FH_G,
    COUNT(CASE WHEN GENDER = 'Unknown' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) AS UH_G,
    COUNT(CASE WHEN GENDER = 'Male' AND ETHNICITY = 'Unknown' THEN line_number END) AS MU_G,
    COUNT(CASE WHEN GENDER = 'Female' AND ETHNICITY = 'Unknown' THEN line_number END) AS FU_G,
    COUNT(CASE WHEN GENDER = 'Unknown' AND ETHNICITY = 'Unknown' THEN line_number END) AS UU_G,
    -- 匹配原Oracle的TOTAL计算逻辑
    (COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) +
     COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) +
     COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Unknown' THEN line_number END) +
     COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Total' THEN line_number END)) AS TOTAL
FROM total_demographics
GROUP BY RACE
ORDER BY 
    CASE RACE
        WHEN 'American Indian or Alaska Native' THEN 0
        WHEN 'Asian' THEN 1
        WHEN 'Native Hawaiian or other Pacific Islander' THEN 2
        WHEN 'Black' THEN 3
        WHEN 'White' THEN 4
        WHEN 'More than one race' THEN 5
        WHEN 'Unknown' THEN 6
        WHEN 'Total' THEN 7
        ELSE 6
    END;

说明:Snowflake原生PIVOT不支持多列透视维度,使用条件聚合替代,通过CASE WHEN精准匹配原查询的GENDER+ETHNICITY组合,统计逻辑与原Oracle完全一致,输出结果与示例表格匹配。

T-SQL 实现

SELECT 
    RACE,
    COUNT(CASE WHEN GENDER = 'Male' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) AS MNH_G,
    COUNT(CASE WHEN GENDER = 'Female' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) AS FNH_G,
    COUNT(CASE WHEN GENDER = 'Unknown' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) AS UNH_G,
    COUNT(CASE WHEN GENDER = 'Male' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) AS MH_G,
    COUNT(CASE WHEN GENDER = 'Female' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) AS FH_G,
    COUNT(CASE WHEN GENDER = 'Unknown' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) AS UH_G,
    COUNT(CASE WHEN GENDER = 'Male' AND ETHNICITY = 'Unknown' THEN line_number END) AS MU_G,
    COUNT(CASE WHEN GENDER = 'Female' AND ETHNICITY = 'Unknown' THEN line_number END) AS FU_G,
    COUNT(CASE WHEN GENDER = 'Unknown' AND ETHNICITY = 'Unknown' THEN line_number END) AS UU_G,
    -- 匹配原Oracle的TOTAL计算逻辑
    (COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Non-Hispanic' THEN line_number END) +
     COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Hispanic or Latino' THEN line_number END) +
     COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Unknown' THEN line_number END) +
     COUNT(CASE WHEN GENDER = 'Total' AND ETHNICITY = 'Total' THEN line_number END)) AS TOTAL
FROM total_demographics
GROUP BY RACE
ORDER BY 
    CASE RACE
        WHEN 'American Indian or Alaska Native' THEN 0
        WHEN 'Asian' THEN 1
        WHEN 'Native Hawaiian or other Pacific Islander' THEN 2
        WHEN 'Black' THEN 3
        WHEN 'White' THEN 4
        WHEN 'More than one race' THEN 5
        WHEN 'Unknown' THEN 6
        WHEN 'Total' THEN 7
        ELSE 6
    END;

说明:T-SQL同样不支持多列PIVOT,条件聚合是最直接的兼容方案,完全复刻原Oracle查询的统计逻辑与排序规则,输出结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:51:07