请求优化SQL查询:按gender与age_group统计总income
修正后的SQL查询及问题说明
原查询存在的核心问题
- WHERE子句逻辑错误:
OR A._gender_='Female'优先级低于AND,导致未关联event、product的account数据被混入查询结果,破坏了表关联逻辑。 - 分组字段错误:原查询按
A._age_和P._price_分组,无法实现按age_group和gender合并统计的需求。 - 收入计算逻辑错误:
count(E._event_name_) * P._price_仅适用于单一单价场景,若不同事件对应不同价格,会导致统计结果失真,正确方式应直接累加每个内购事件的对应价格。 - 表连接不规范:使用逗号连接表易引发笛卡尔积,建议用显式
JOIN明确关联关系。
修正后的SQL语句
SELECT A._gender_, SUM(P._price_) AS income, CASE WHEN A._age_ BETWEEN 0 AND 18 THEN '0-18' WHEN A._age_ BETWEEN 19 AND 24 THEN '19-24' WHEN A._age_ BETWEEN 25 AND 30 THEN '25-30' WHEN A._age_ BETWEEN 31 AND 40 THEN '31-40' WHEN A._age_ BETWEEN 41 AND 55 THEN '41-55' ELSE '其他' -- 处理不在指定区间的年龄 END AS age_group FROM event E JOIN Account A ON E._device_id_ = A._device_id_ JOIN Product P ON E._event_name_ = P._event_name_id WHERE E._event_name_ IN ('App_Purchase_001', 'App_Purchase_002', 'App_Purchase_003') AND A._gender_ IN ('Male', 'Female') GROUP BY A._gender_, age_group ORDER BY age_group, A._gender_; -- 可选排序,让结果更直观
修正效果说明
- 严格按
gender和age_group合并分组,解决重复分组问题 - 收入计算改为累加每个内购事件的产品价格,统计结果准确
- 显式
JOIN语句让表关联逻辑更清晰,避免不必要的笛卡尔积 - 新增
ELSE分支处理超出指定范围的年龄,避免age_group出现NULL值
内容的提问来源于stack exchange,提问作者Gulizar
相关产品推荐
相关产品推荐

