在 Group By 子句中对值进行分组

Grouping values in Group By clause

请考虑这个简单的问题 table:

declare @tbl  Table
(
    Id          int IDENTITY(1,1), 
    [Year]      int,
    [Month]     tinyint,
    [Value]     int
);

insert into @tbl VALUES
    (2010, 1, 2000),
    (2010, 2, 500),
    (2011, 4, 8000),
    (2011, 1, 800),
    (2010, 1, 5000),
    (2011, 5, 1000),
    (2010, 8, 7000),
    (2011, 3, 7000),
    (2010, 1, 4000),
    (2011, 1, 900),
    (2011, 1, 9000)

我想按 YearMonth 对这些记录进行分组,但在结果中我想要一个每年的数字表示每 3 个月的时间段:

1             First 3-Months period
2             Second 3-Months period
3             third 3-Months period
4             Fourth 3-Months period

我想要的结果是:

Year        Period              Sum Of Values
---------------------------------------------
2010          1                     11500
2010          3                     7000
2011          1                     17700
2011          2                     9000

我怎样才能得到这个结果?谢谢

您可以使用 (month+2)/3:

计算 period/quarter
select year, (month+2) / 3 as quarter, sum(value)
from @tbl
group by year, (month+2) / 3
order by 1,2

fiddle

我会用月份的 ceiling 除以 3.0 来计算周期。您需要使用 3.0 而不是 3,否则 SQL 服务器会将除法结果计算为整数(这将是取底的结果)。

select year, ceiling(month/3.0)  , sum(value) from @tbl
group by year, ceiling(month/3.0) 
order by 1,2

如果您需要更改期间,您只需更改您的部门的分母,例如 6 个月的期间将完成

select year, ceiling(month/6.0)  , sum(value) from @tbl
group by year, ceiling(month/6.0) 
order by 1,2

这里有一个 fiddle 演示了这一点,包括整数除法问题 https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=7c107c98928d262330513c2f33484366