SQL Server按job_number和小时分组统计批量数据求助
解决按
job_number和小时分组统计的SQL方案 核心实现思路
要生成单日每小时、每个job的批量完成数报表,核心是分组聚合+列转行,这里提供两种通用方案,适配不同SQL数据库:
方法一:CASE WHEN条件聚合(全数据库通用)
假设你的原始表包含job_number(工单号)、complete_time(完成时间)、batch_count(批量完成数)三个核心字段,直接用CASE WHEN配合SUM实现分组统计:
SELECT job_number, -- 针对每个小时段做条件统计,没有数据则返回NULL SUM(CASE WHEN EXTRACT(HOUR FROM complete_time) = 10 THEN batch_count ELSE NULL END) AS hour_10, SUM(CASE WHEN EXTRACT(HOUR FROM complete_time) = 11 THEN batch_count ELSE NULL END) AS hour_11, -- 按需求补充0-23所有小时段的统计逻辑 SUM(CASE WHEN EXTRACT(HOUR FROM complete_time) = 23 THEN batch_count ELSE NULL END) AS hour_23 FROM your_table_name WHERE -- 筛选单日数据,替换成你需要的日期 DATE(complete_time) = '2024-05-20' GROUP BY job_number;
如果你的需求是统计记录条数而非批量数,把batch_count换成1即可:
SUM(CASE WHEN EXTRACT(HOUR FROM complete_time) = 10 THEN 1 ELSE NULL END) AS hour_10
方法二:PIVOT透视表(适用于Oracle、SQL Server、PostgreSQL 11+)
以SQL Server为例,用原生PIVOT语法简化逻辑:
SELECT job_number, [10] AS hour_10, [11] AS hour_11, -- 补充其他需要展示的小时段 [23] AS hour_23 FROM ( -- 先提取核心分组字段和统计值 SELECT job_number, DATEPART(HOUR, complete_time) AS hour, batch_count FROM your_table_name WHERE CAST(complete_time AS DATE) = '2024-05-20' ) AS source_data PIVOT ( SUM(batch_count) -- 指定要转成列的小时值 FOR hour IN ([10], [11], [12], ..., [23]) ) AS pivot_table;
常见问题排查
- 若分组后出现重复
job_number:检查GROUP BY是否仅包含job_number,避免误加其他字段。 - 若小时字段全为NULL:排查时间字段的时区是否正确,或日期筛选条件是否匹配数据格式。
- 若统计数值错误:确认聚合函数(SUM/COUNT)是否符合需求,比如是统计批量数还是记录数。
内容的提问来源于stack exchange,提问作者g3tty90
相关产品推荐
相关产品推荐

