如何按自然月周数统计上月开户数?SQL语法修正咨询
修正SQL以获取上月按当月周数统计的开户数量
原查询使用datepart(ww, doo)返回的是年度周数,要得到当月内的周序号(比如4月第一周显示为1),需要计算每个开户日期相对于当月第一天的周偏移量。
修正后的SQL语句
select DATEDIFF(week, DATEADD(month, DATEDIFF(month, 0, doo), 0), doo) + 1 as 'Week No.', count(*) as 'No. of Account' from accountmaster where datediff(mm, doo, getdate()) = 1 group by DATEDIFF(week, DATEADD(month, DATEDIFF(month, 0, doo), 0), doo) + 1 order by 'Week No.'
关键逻辑说明
DATEADD(month, DATEDIFF(month, 0, doo), 0):精准获取doo字段对应日期所在月份的第一天DATEDIFF(week, 当月第一天, doo) + 1:计算当前日期与当月第一天的周数差,加1后得到从1开始计数的当月周序号- 分组条件与查询字段的周数计算逻辑完全一致,确保分组统计的准确性
简化写法(适用于SQL Server 2022及以上版本)
如果你的SQL Server版本支持DATE_TRUNC函数,可以用更简洁的写法:
select DATEPART(week, doo) - DATEPART(week, DATE_TRUNC('month', doo)) + 1 as 'Week No.', count(*) as 'No. of Account' from accountmaster where datediff(mm, doo, getdate()) = 1 group by DATEPART(week, doo) - DATEPART(week, DATE_TRUNC('month', doo)) + 1 order by 'Week No.'
内容的提问来源于stack exchange,提问作者Aniket Thakale
相关产品推荐
相关产品推荐

