如何在PostgreSQL中统计两列中各国家的账户总数?
解决PostgreSQL中多列国家的账户统计问题
嘿,这个需求其实很好实现,核心思路就是先把两列里的国家数据合并成一个统一的列表,再做分组统计就行。我给你详细拆解下:
实现方案
我们可以用UNION ALL把country1和country2的非空国家值合并到一个临时结果集里,然后对这个结果集分组计数。这样不管国家出现在哪一列,都会被正确统计到。
对应的SQL语句如下:
SELECT country, COUNT(*) AS account_count FROM ( -- 取出country1列的所有非空国家 SELECT country1 AS country FROM accounts WHERE country1 IS NOT NULL -- 用UNION ALL合并country2列的非空国家(不自动去重,保证每个国家实例都被统计) UNION ALL SELECT country2 AS country FROM accounts WHERE country2 IS NOT NULL ) AS combined_countries -- 按国家分组统计关联的账户数量 GROUP BY country -- 可选:按数量降序、国家名称升序排序,让结果更直观 ORDER BY account_count DESC, country;
关键细节说明
UNION ALL的必要性:这里不能用UNION,因为UNION会自动去重,会导致同一个账户里的两个国家被合并,而我们需要的是每个国家在任意一列出现一次,就算关联了一个账户(比如例子里的France在两行各出现一次,要统计成2)。- 过滤NULL值:添加
WHERE countryX IS NOT NULL是为了避免把空值当成一个“国家”统计进去,毕竟你的示例数据里存在country2为空的行。
用你的示例数据验证
拿你给出的测试数据:
account_number | country1 | country2 123 | France | Germany 124 | Switzerland | France 125 | Germany | NULL
子查询combined_countries会输出:
France Germany Switzerland France Germany
外层分组统计后就会得到你期望的结果:
country | account_count France | 2 Germany | 2 Switzerland | 1
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

