3表关联双条件筛选SQL报错求助:查询指定客户信息
问题分析与修正方案
原SQL的核心问题
- 日期条件不符:你需要筛选
2022-01-22至2022-03-22的注册客户,但子查询里写的是2022-01-01到2022-03-31,偏离需求。 - 聚合函数使用错误:
AVG()这类聚合条件不能放在WHERE子句,必须用HAVING——WHERE是分组前筛数据,HAVING是分组后筛聚合结果。 - 分组逻辑混乱:应该按客户的唯一ID(及姓名字段)分组,而非交易表的
client_id,避免分组结果异常。 - 不必要的LEFT JOIN:你要的是同时满足两个条件的客户,用
INNER JOIN更高效,不会保留无效的NULL记录。 - 数值比较带引号:
300和500是数值,加引号会触发字符串比较逻辑,导致结果错误。
修正后的SQL语句
SELECT c.name, c.surname FROM clients c INNER JOIN clients_history ch ON c.id = ch.client_id INNER JOIN transactions t ON c.id = t.client_id WHERE ch.action = 'register' AND ch.date BETWEEN '2022-01-22' AND '2022-03-22' GROUP BY c.id, c.name, c.surname HAVING AVG(t.amount) BETWEEN 300 AND 500;
语句说明
- 关联逻辑:通过
client_id依次关联三张表,确保只获取有有效注册记录和交易记录的客户。 - 日期筛选:用
BETWEEN简化区间判断,精准匹配你需要的注册时间范围。 - 分组与聚合:按客户ID和姓名分组,通过
HAVING筛选出交易金额平均值符合要求的客户。 - 性能优化:
INNER JOIN减少无效数据加载,提升查询效率。
内容的提问来源于stack exchange,提问作者gresell
相关产品推荐
相关产品推荐

