如何将多行工时数据按JobCd和Year聚合为单列总计
解决SQL GROUP BY聚合查询的字段错误问题
问题场景
我有一张包含JobCd、Year、MO、Tot_Hrs字段的Hours表,每条记录对应一个JobCd的某一月(MO)的总工时。我需要获取2024年每个JobCd的累计总工时,而非按月展示的明细。使用SUM(Tot_Hrs)时,收到错误提示:
Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
原始代码
CREATE TABLE Hours ( JobCd int, Year int, MO int, Tot_Hrs int ); INSERT INTO Hours (JobCd, Year, MO, Tot_Hrs) VALUES ('160', '2024', '1', '100'), ('160', '2024', '2', '100'), ('160', '2024', '3', '100'), ('160', '2024', '4', '100'), ('160', '2024', '5', '100'), ('160', '2024', '6', '100'), ('170', '2024', '1', '100'), ('170', '2024', '2', '100'), ('170', '2024', '3', '100'), ('170', '2024', '4', '100'), ('170', '2024', '5', '100'), ('170', '2024', '6', '100'); SELECT JobCd, Year, sum(Tot_Hrs) FROM Hours GROUP BY JobCd, Year;
错误原因
出现这个错误的核心逻辑是:SELECT子句中出现的非聚合字段,必须全部包含在GROUP BY子句中。如果之前的代码仅将JobCd加入GROUP BY,但SELECT里同时包含了Year,就会触发该错误——数据库无法确定要返回哪个Year的值,因为同一个JobCd可能对应多个年份的数据。
正确优化方案
你现有的代码已符合语法要求,但可以新增WHERE条件过滤2024年的数据,避免统计其他年份的工时;同时给聚合后的字段起别名,让结果更贴合需求:
SELECT JobCd, Year, SUM(Tot_Hrs) AS Tot_Hrs FROM Hours WHERE Year = 2024 GROUP BY JobCd, Year;
期望输出
| JobCd | Year | Tot_Hrs |
|---|---|---|
| 160 | 2024 | 600 |
| 170 | 2024 | 600 |
内容的提问来源于stack exchange,提问作者ChrsKslr
相关产品推荐
相关产品推荐

