如何用单条SQL计算demo表中有理赔记录的会员占比(适配MariaDB、SQLite)
兼容MariaDB与SQLite的单条查询语句
SELECT ROUND( (COUNT(DISTINCT claims.ID) * 100.0) / COUNT(DISTINCT demo.ID), 2 ) AS claim_member_percentage FROM demo LEFT JOIN claims ON demo.ID = claims.ID;
逻辑说明
- 采用左连接保留demo表的全量会员记录,避免过滤掉无理赔的会员
COUNT(DISTINCT claims.ID)仅统计存在理赔记录的唯一会员ID,无理赔的对应行claims.ID为NULL,不会被计入统计,完全等价你给出的第一个查询结果- 乘以
100.0是为了强制触发浮点运算,避免整数除法导致结果取整为0的问题 - 末尾的2是保留2位小数,可根据需求自行调整,不需要格式化精度可直接去掉ROUND函数
避免除以0的优化版本
如果demo表可能为空,可增加空值判断避免报错:
SELECT CASE WHEN COUNT(DISTINCT demo.ID) = 0 THEN 0 ELSE ROUND((COUNT(DISTINCT claims.ID) * 100.0) / COUNT(DISTINCT demo.ID), 2) END AS claim_member_percentage FROM demo LEFT JOIN claims ON demo.ID = claims.ID;
内容的提问来源于stack exchange,提问作者always_learning
相关产品推荐
相关产品推荐

