PostgreSQL-NodeJS中统计值出现占比的SQL查询方案
SQL查询:统计指定字段达标数量并计算占比
嘿,针对你的需求,咱们可以用CASE条件判断结合简单算术运算来实现,思路很直观,适合刚学SQL的你理解:
核心思路
咱们要逐个检查hh_total_fhc_0到hh_total_fhc_4这5个字段:
- 如果字段值≥1(自动忽略
null,因为null和任何值比较都会返回null,最终会被判定为不达标),就记为1分 - 不满足条件的(包括值<1或者
null)记为0分
把这5个字段的分数加起来,就是达标的字段总数,再除以hh_match_count就能得到占比了。
针对≥1的SQL查询语句
SELECT hh_match_count, -- 计算达标的字段数量 ( CASE WHEN hh_total_fhc_0 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_1 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_2 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_3 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_4 >= 1 THEN 1 ELSE 0 END ) AS qualified_field_count, -- 计算占比:用1.0强制转换为浮点型,避免整数除法丢失精度,ROUND保留两位小数可按需调整 ROUND( ( CASE WHEN hh_total_fhc_0 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_1 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_2 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_3 >= 1 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_4 >= 1 THEN 1 ELSE 0 END ) / 1.0 / hh_match_count, 2 ) AS qualified_ratio FROM your_table_name; -- 记得把这里替换成你的实际表名
扩展到≥2、≥3的情况
非常简单!只需要把每个CASE语句里的>=1改成你需要的阈值就行,比如统计≥2的字段占比:
SELECT hh_match_count, ( CASE WHEN hh_total_fhc_0 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_1 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_2 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_3 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_4 >= 2 THEN 1 ELSE 0 END ) AS qualified_field_count, ROUND( ( CASE WHEN hh_total_fhc_0 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_1 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_2 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_3 >= 2 THEN 1 ELSE 0 END + CASE WHEN hh_total_fhc_4 >= 2 THEN 1 ELSE 0 END ) / 1.0 / hh_match_count, 2 ) AS qualified_ratio FROM your_table_name;
小补充
如果以后字段数量变多(比如到hh_total_fhc_10),重复写CASE会有点繁琐,那时候可以学习用列转行的技巧(比如SQL Server的UNPIVOT、MySQL的UNION ALL)来简化,但目前只有5个字段,直接写CASE是最直观易懂的方式,适合你逐步加深对SQL的理解。
内容的提问来源于stack exchange,提问作者Richlewis
相关产品推荐
相关产品推荐

