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

PostgreSQL实现性别统计结果行列转换的SQL查询(含Union与非Union方案)

需求说明

现有数据集如下:

name|gender|
----+------+
AA  |Male  |
BB  |Male  |
CC  |Male  |
DD  |Female|
EE  |Female|

当前使用以下SQL统计性别数量:

select 
    gender,count(*)
from 
    schoolofit.user_request_1
group by gender

得到的结果为:

gender|count|
------+-----+
Female|    2|
Male  |    3|

但需要得到如下格式的结果:

gender-1 | gender-2
-------------------
Male     | Female
3        |  2 

以下是两种PostgreSQL实现方案:


方案1:使用UNION实现

通过UNION ALL将性别名称行和统计数值行合并,确保列结构一致:

-- 第一行返回性别名称
SELECT
    'Male' AS "gender-1",
    'Female' AS "gender-2"
UNION ALL
-- 第二行返回统计数量,转换为字符串对齐格式
SELECT
    CAST(SUM(CASE WHEN gender = 'Male' THEN 1 ELSE 0 END) AS VARCHAR) AS "gender-1",
    CAST(SUM(CASE WHEN gender = 'Female' THEN 1 ELSE 0 END) AS VARCHAR) AS "gender-2"
FROM schoolofit.user_request_1;

方案2:不使用UNION实现(基于行生成)

先聚合得到男女数量,再通过生成两行数据分别展示名称和数值:

SELECT
    -- 根据行号判断显示名称还是数量
    CASE rn 
        WHEN 1 THEN 'Male' 
        ELSE CAST(male_count AS VARCHAR) 
    END AS "gender-1",
    CASE rn 
        WHEN 1 THEN 'Female' 
        ELSE CAST(female_count AS VARCHAR) 
    END AS "gender-2"
FROM (
    -- 一次性统计男女数量
    SELECT
        COUNT(*) FILTER (WHERE gender = 'Male') AS male_count,
        COUNT(*) FILTER (WHERE gender = 'Female') AS female_count
    FROM schoolofit.user_request_1
) t,
-- 生成2行数据,对应名称行和数值行
GENERATE_SERIES(1,2) AS rn;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:52:21