SQL实现按月统计每日表中符合条件的记录总数
按月统计分表中符合条件的记录数
针对你每天一张表的场景,要按月统计mti=200的记录总数,可以通过动态SQL自动遍历所有目标表,提取表名中的年月信息后分组统计,无需手动逐个写表名。
解决方案(SQL Server环境)
DECLARE @SQL NVARCHAR(MAX) = '' -- 遍历所有符合命名规则的表,生成每个表的统计语句 SELECT @SQL = @SQL + ' SELECT ''' + LEFT(REPLACE(t.name, 'TransRecordTable_', ''), 6) + ''' AS 年月, COUNT(*) AS 单表记录数 FROM [Rayanparsi].[dbo].[' + t.name + '] WHERE mti = 200 UNION ALL' FROM sys.tables t WHERE t.name LIKE 'TransRecordTable[_]%' -- 移除最后多余的UNION ALL SET @SQL = LEFT(@SQL, LEN(@SQL) - 10) -- 外层按年月分组求和,得到月度统计结果 SET @SQL = ' SELECT 年月, SUM(单表记录数) AS 月度总记录数 FROM (' + @SQL + ') AS temp GROUP BY 年月 ORDER BY 年月' -- 执行动态SQL EXEC sp_executesql @SQL
关键逻辑说明
- 表名提取年月:从表名
TransRecordTable_14000601中,通过LEFT(REPLACE(t.name, 'TransRecordTable_', ''), 6)截取前6位140006作为年月标识(对应波斯历1400年6月)。 - 动态生成统计语句:自动遍历所有以
TransRecordTable_开头的表,为每个表生成独立的统计语句,用UNION ALL合并结果。 - 分组求和:外层查询按年月分组,将同一月份所有表的记录数相加,得到月度总数。
注意事项
- 确保所有分表的结构完全一致,且都包含
mti字段。 - 执行该SQL需要具备访问
sys.tables系统视图的权限。 - 如果表名的日期格式有变化(比如年份/月份位数不同),需要调整
LEFT函数的截取长度。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

