如何无需手动编写60个查询统计近5年每月有效检验员数量?
高效统计近5年每月有效检验员数量的方法
不用手动写60个查询,你可以通过生成月度日期序列+关联统计的方式一次性得到所有月份的结果,核心思路是先构造出近5年每个月的月末日期,再针对每个日期统计符合条件的检验员数量。
具体实现(适配你提供的Access SQL环境)
生成月度日期序列
先构造出近5年所有月份的月末日期。如果没有现成的数字辅助表,可以用现有检验员表生成60条记录(对应5年60个月)来生成日期:-- 生成包含60个月份偏移量的临时数据集 SELECT TOP 60 (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1) AS MonthOffset INTO MonthOffsets FROM dbo_Insp_Type; -- 基于偏移量生成每个月的月末日期 SELECT DateSerial(Year(Date()) - 5, 1 + MonthOffset, 1) AS MonthStart, DateAdd("d", -1, DateSerial(Year(Date()) - 5, 2 + MonthOffset, 1)) AS MonthEnd INTO MonthlyDates FROM MonthOffsets WHERE DateSerial(Year(Date()) - 5, 1 + MonthOffset, 1) <= Date();关联统计有效人数
用生成的月度日期表关联检验员表,按每个月末日期分组统计:SELECT Format(md.MonthEnd, "yyyy-mm") AS Month, COUNT(it.CERT_EXP_DTE) AS ValidInspectorCount FROM MonthlyDates md LEFT JOIN dbo_Insp_Type it ON it.CERT_EXP_DTE > md.MonthEnd GROUP BY md.MonthEnd, Format(md.MonthEnd, "yyyy-mm") ORDER BY md.MonthEnd;
逻辑说明
- 先通过日期函数生成每个月的月末日期,确保统计的是该月结束时的有效检验员(完全匹配你要求的“认证过期日期晚于对应月末日期”的规则)。
- 左关联检验员表后分组统计,自动输出所有月份的结果,无需手动重复编写查询。
如果你的数据库支持递归CTE(比如SQL Server、MySQL 8.0+),还可以用更简洁的递归方式生成日期序列:
-- SQL Server 示例:递归生成近5年的月末日期 WITH MonthlyDates AS ( SELECT DATEFROMPARTS(YEAR(GETDATE()) - 5, 1, 1) AS MonthStart, EOMONTH(DATEFROMPARTS(YEAR(GETDATE()) - 5, 1, 1)) AS MonthEnd UNION ALL SELECT DATEADD(month, 1, MonthStart), EOMONTH(DATEADD(month, 1, MonthStart)) FROM MonthlyDates WHERE MonthStart <= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) ) SELECT FORMAT(MonthEnd, 'yyyy-MM') AS Month, COUNT(it.CERT_EXP_DTE) AS ValidInspectorCount FROM MonthlyDates md LEFT JOIN dbo_Insp_Type it ON it.CERT_EXP_DTE > md.MonthEnd GROUP BY MonthEnd, FORMAT(MonthEnd, 'yyyy-MM') ORDER BY MonthEnd OPTION (MAXRECURSION 60); -- 限制递归次数为60次(对应5年)
内容的提问来源于stack exchange,提问作者Creebag
相关产品推荐
相关产品推荐

