SQL查询问题咨询:按项目统计工时的语句报错原因排查
你的SQL查询存在的问题及修复方案
核心问题拆解
- 字段名不匹配:示例表中Project的项目编号字段是
PNo,但你写的是Pnumber,数据库会找不到该列直接报错。 - 子查询返回多行:你写的子查询
(select sum(Hours) from Worksfor group by (Pno))会返回每个项目的总工时,属于多行结果,但标量子查询(作为列返回)只能返回单行,这会触发"子查询返回的值不止一个"的错误。 - 表连接与分组缺失:用逗号连接Project和WorksFor且未分组,会生成笛卡尔积,导致每条工时记录都对应一条项目记录,结果会重复显示项目信息,总工时也无法正确计算。
- 排序逻辑错误:你用
w.Hours排序,这是单条工作记录的工时,不是项目的总工时,和需求要求的"按总工时排序"不符。
正确的查询写法
SELECT p.PNo AS 项目编号, p.PName AS 项目名称, ISNULL(SUM(w.Hours), 0) AS 总工时 FROM @Project p LEFT JOIN @WorksFor w ON p.PNo = w.PNo GROUP BY p.PNo, p.PName ORDER BY 总工时 DESC; -- 可根据需求改为ASC升序
写法说明
- 用
LEFT JOIN关联两张表,确保哪怕没有员工参与的项目也能被查询到(总工时显示0)。 - 通过
GROUP BY p.PNo, p.PName按项目分组,用SUM(w.Hours)计算每个项目的总工时,ISNULL处理无工时的情况。 - 直接使用分组后的聚合字段
总工时排序,符合需求。 - 字段名和示例表保持一致,避免列不存在的错误。
内容的提问来源于stack exchange,提问作者The Engineer
相关产品推荐
相关产品推荐

