查询打印AGENTID、NAME、NUMBEROFSALES的SQL语句相关问题咨询
原SQL存在的问题
- 字段缺失:外层SELECT仅查询了AGENTID、NAME两个字段,没有包含需求要求的NUMBEROFSALES统计字段
- WHERE语法错误:
WHERE =左侧缺少待匹配的字段名,不符合SQL基本语法规则 - 匹配逻辑错误:用
=运算符匹配返回多行多列的子查询结果,=仅支持单值匹配,子查询GROUP BY后会返回多个AGENTID的统计结果,执行时会直接报错 - 冗余排序:子查询内的ORDER BY没有实际作用,子查询作为关联数据源时内部排序不会对外部查询生效
修正方案
优先采用两表关联的写法,逻辑更直观,执行效率更高:
SELECT sa.AGENTID, sa.NAME, COUNT(st.AGENTID) AS NUMBEROFSALES FROM SALESAGENT sa LEFT JOIN SALESTRANSACTION st ON sa.AGENTID = st.AGENTID GROUP BY sa.AGENTID, sa.NAME ORDER BY NUMBEROFSALES DESC;
补充说明
- 上述语句用LEFT JOIN可以保留无销售记录的销售代理数据,对应NUMBEROFSALES结果为0。如果仅需要查询有销售记录的代理,把LEFT JOIN替换为INNER JOIN即可。
- 若需要用子查询实现,可采用关联子查询的写法:
SELECT AGENTID, NAME, (SELECT COUNT(AGENTID) FROM SALESTRANSACTION st WHERE st.AGENTID = sa.AGENTID) AS NUMBEROFSALES FROM SALESAGENT sa ORDER BY NUMBEROFSALES DESC;
内容的提问来源于stack exchange,提问作者Vulture
相关产品推荐
相关产品推荐

