You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键逻辑说明

  1. 表名提取年月:从表名TransRecordTable_14000601中,通过LEFT(REPLACE(t.name, 'TransRecordTable_', ''), 6)截取前6位140006作为年月标识(对应波斯历1400年6月)。
  2. 动态生成统计语句:自动遍历所有以TransRecordTable_开头的表,为每个表生成独立的统计语句,用UNION ALL合并结果。
  3. 分组求和:外层查询按年月分组,将同一月份所有表的记录数相加,得到月度总数。

注意事项

  • 确保所有分表的结构完全一致,且都包含mti字段。
  • 执行该SQL需要具备访问sys.tables系统视图的权限。
  • 如果表名的日期格式有变化(比如年份/月份位数不同),需要调整LEFT函数的截取长度。

内容的提问来源于stack exchange,提问作者Emma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:03:23