如何在PostgreSQL中对同一列按不同条件统计并输出为多列
合并IP对应的up_score 0和1的统计查询
你可以通过条件聚合实现一次查询得到每个IP对应的up_score为1和0的数量,具体SQL语句如下:
SELECT ip, SUM(CASE WHEN up_score = 1 THEN 1 ELSE 0 END) AS count_1, SUM(CASE WHEN up_score = 0 THEN 1 ELSE 0 END) AS count_0 FROM net_score GROUP BY ip ORDER BY ip;
原理说明
- 利用
CASE WHEN对每条记录的up_score进行判断:符合目标值则返回1,否则返回0,再通过SUM函数累加得到对应计数。 - 这种写法会保留所有出现过的IP,即使某个IP没有
up_score=0或up_score=1的记录,对应的计数会自动显示为0,完全匹配你期望的结果格式。 - 相比两次单独查询,一次聚合查询只需要扫描表一次,效率更高。
你也可以用COUNT函数实现相同效果:
SELECT ip, COUNT(CASE WHEN up_score = 1 THEN 1 END) AS count_1, COUNT(CASE WHEN up_score = 0 THEN 1 END) AS count_0 FROM net_score GROUP BY ip ORDER BY ip;
COUNT函数会忽略NULL值,当CASE条件不满足时返回NULL,因此只会统计符合条件的记录数。
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

