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

SQL Server按Trimester(三个月周期)分组查询问题求助

SQL Server按Trimester(三个月周期)分组查询的正确实现

需要在SQL Server中实现按**Trimester(三个月周期)**分组统计记录数,期望输出每个周期的起始日期、结束日期及对应记录数,示例结果如下:

Range Start  Range End   Count
-----------  ----------  -----
2013-09-01   2013-11-26  87
2013-06-01   2013-08-31  92
2013-03-01   2013-05-31  92
2012-12-01   2013-02-28  90
2012-09-01   2012-11-30  91

尝试了以下SQL语句,但分组逻辑错误,得到的结果不符合预期:

SELECT MIN(start_date) AS Range_Start, MAX(start_date) AS Range_End, COUNT(ID) AS Total
FROM [dbo].[table]
GROUP BY FLOOR(DATEDIFF(MONTH, DATEADD(DAY, -DAY(start_date)+1, start_date), DATEADD(DAY, -DAY(start_date)+1,getdate())) /3) 
ORDER BY 1 ASC

错误结果示例:

Range Start             Range End               Count
-----------             ----------              -----
1900-01-01 00:00:00.000 1900-01-01 00:00:00.000 8
1952-01-01 00:00:00.000 1952-01-01 00:00:00.000 2
1954-01-01 00:00:00.000 1954-01-01 00:00:00.000 11
1955-01-01 00:00:00.000 1955-01-01 00:00:00.000 3
1956-01-01 00:00:00.000 1956-01-01 00:00:00.000 2
1957-01-01 00:00:00.000 1957-01-01 00:00:00.000 8
1958-01-01 00:00:00.000 1958-01-01 00:00:00.000 2
1959-01-01 00:00:00.000 1959-01-01 00:00:00.000 5
1960-01-01 00:00:00.000 1960-01-01 00:00:00.000 17
1960-03-17 00:00:00.000 1960-03-17 00:00:00.000 1

正确实现方案

核心是基于每条记录的start_date计算其所属Trimester的固定起始日期,再按该起始日期分组,确保同属一个三个月周期的记录被归为一组。

根据示例中的周期划分(12月-次年2月、3月-5月、6月-8月、9月-11月),SQL语句如下:

SELECT
    MIN(start_date) AS Range_Start,
    MAX(start_date) AS Range_End,
    COUNT(ID) AS Total
FROM [dbo].[table]
GROUP BY
    CASE
        -- 12月、1月、2月的记录,归为上一年12月1日起始的周期
        WHEN MONTH(start_date) IN (12, 1, 2) THEN DATEFROMPARTS(
            CASE WHEN MONTH(start_date) IN (1, 2) THEN YEAR(start_date) - 1 ELSE YEAR(start_date) END,
            12,
            1
        )
        -- 3-5月归为当年3月1日起始的周期
        WHEN MONTH(start_date) BETWEEN 3 AND 5 THEN DATEFROMPARTS(YEAR(start_date), 3, 1)
        -- 6-8月归为当年6月1日起始的周期
        WHEN MONTH(start_date) BETWEEN 6 AND 8 THEN DATEFROMPARTS(YEAR(start_date), 6, 1)
        -- 9-11月归为当年9月1日起始的周期
        WHEN MONTH(start_date) BETWEEN 9 AND 11 THEN DATEFROMPARTS(YEAR(start_date), 9, 1)
    END
-- 按周期起始日期倒序,与示例结果顺序一致
ORDER BY Range_Start DESC;

逻辑说明

  • 原SQL的错误在于:通过当前日期与记录日期的月份差分组,会导致不同年份但与当前日期间隔相同的月份被错误归为一组,无法实现按固定三个月周期分组的需求。
  • 新方案通过CASE语句直接计算每条记录所属Trimester的固定起始日期,确保同一周期内的记录被正确分组,最终输出符合预期的统计结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:30:45