如何用带子查询的单条Oracle SQL语句计算用户有效物品占比?
解决方案
可以通过外层查询关联person表,结合子查询分别统计每个用户的有效物品数和总物品数,最终计算占比并格式化输出,SQL语句如下:
SELECT p.person_id, CONCAT( ROUND( COALESCE( (SELECT COUNT(*) FROM item i WHERE i.person_id = p.person_id AND i.item_valid = 1) / NULLIF((SELECT COUNT(*) FROM item i WHERE i.person_id = p.person_id), 0) * 100, 0 ), 0 ), '%' ) AS percentage FROM person p;
语句说明:
- 外层查询遍历
person表的所有用户 - 第一个子查询
(SELECT COUNT(*) FROM item i WHERE i.person_id = p.person_id AND i.item_valid = 1):统计当前用户的有效物品数量(仅统计item_valid=1的记录) - 第二个子查询
(SELECT COUNT(*) FROM item i WHERE i.person_id = p.person_id):统计当前用户的总物品数量 NULLIF(..., 0):避免出现除以0的错误(若用户无物品时,总物品数为0,此处将其转为NULL)COALESCE(..., 0):当总物品数为0时,直接返回0作为占比基数,避免计算结果为NULLROUND(..., 0):将占比结果取整,确保输出整数百分比CONCAT(..., '%'):将数值结果拼接百分号,格式化输出为X%的形式
该语句会准确返回每个用户的有效物品占比,包括用户只有无效物品(占比0%)、全有效物品(占比100%)的情况,完全符合需求中的期望结果。
内容的提问来源于stack exchange,提问作者Grandmarkkk
相关产品推荐
相关产品推荐

