如何在单条SQL查询中关联3张表统计不同出生日期朋友的派对参与数据
实现方案
原SQL报错原因
SELECT子句中的子查询返回了多行多列,不符合单值表达式的语法要求,同时主查询缺少FROM数据源,逻辑结构完全错误。
正确SQL语句
-- Oracle环境适用,和你提供的建表语法兼容 SELECT f.dayBirth, TRIM(TO_CHAR(f.dayBirth, 'DAY')) AS weekDay, COUNT(CASE WHEN EXISTS ( SELECT 1 FROM tblIsAssignedParty iap WHERE iap.idMother = f.idMother ) THEN 1 END) AS totalFriendsForParty, TRUNC( COUNT(CASE WHEN EXISTS ( SELECT 1 FROM tblIsAssignedParty iap WHERE iap.idMother = f.idMother ) THEN 1 END) / SUM(COUNT(*)) OVER(), 2 ) AS totalFriendsForPartyPercent, COUNT(CASE WHEN NOT EXISTS ( SELECT 1 FROM tblIsAssignedParty iap WHERE iap.idMother = f.idMother ) THEN 1 END) AS totalFriendsNoParty, TRUNC( COUNT(CASE WHEN NOT EXISTS ( SELECT 1 FROM tblIsAssignedParty iap WHERE iap.idMother = f.idMother ) THEN 1 END) / SUM(COUNT(*)) OVER(), 2 ) AS totalFriendsNoPartyPercent FROM tblFriends f GROUP BY f.dayBirth ORDER BY f.dayBirth;
逻辑说明
- 用
EXISTS判断朋友对应的母亲是否分配了派对,避免一个母亲对应多个派对时产生重复计数问题 - 用聚合函数
SUM(COUNT(*)) OVER()计算全表朋友总数量,无需额外嵌套子查询即可计算占比 - 按
dayBirth分组后,用条件计数分别统计有派对、无派对的朋友数量,直接匹配输出要求的字段 - 若需要百分比展示为带%的格式,可将占比计算逻辑调整为
TRUNC(计数/总数量*100,2) || '%'
内容的提问来源于stack exchange,提问作者Kuru
相关产品推荐
相关产品推荐

