Year Salary
2014 5000
2015 6500
2016 6800
2017 6900
2018 7000
2019 8000
我想动态分组数据。假设我要2组,则数据应分为2组,每组2年 结果集为:
Year Salary
2014-2015 11500
2016-2017 13300
2018-2019 15000
如果我想要3人一组,
Year. Salary
2014-2016 18300
2017-2019 21900
无硬编码
答案 0 :(得分:2)
您可以使用窗口函数和聚合来执行此操作。假设每个组要 n 年:
select min(year), max(year), sum(salary)
from (select t.*, min(year) over () as min_year
from t
) t
group by floor((year - min_year) / @n)
order by min(year);
答案 1 :(得分:0)
例如,您可以创建一些变量,以帮助您在表格中创建组,例如2014-2015等。调整@RowsToGroup
时,您可以根据需要对任意行进行分组。 @remainder
有助于在Year
中查找下一组。在CTE
中,我用sum as a window function
加case
创建了一个到group by
的列。
create table #years (Year int, Salary int )
insert into #years values (2014 ,5000)
insert into #years values (2015 ,6500)
insert into #years values (2016 ,6800)
insert into #years values (2017 ,6900)
insert into #years values (2018 ,7000)
insert into #years values (2019 ,8000)
declare @minYear int = (select min(Year) from #years);
declare @RowsToGroup int = 2;
declare @remainder decimal(12,6) = (select @minYear % @RowsToGroup) ;
with YearsToGroup as (
select
*
,sum(case when Year % @RowsToGroup = @remainder then 1 else 0 end) over (order by Year asc) as grouping
from #years
)
select
cast(min(Year) as varchar(10)) + '-' + cast(max(Year) as varchar(10)) as years
,sum(salary) as salary
from YearsToGroup
group by grouping
@RowsToGroup = 2的结果
years salary
2014-2015 11500
2016-2017 13700
2018-2019 15000
@RowsToGroup = 3的结果
years salary
2014-2016 18300
2017-2019 21900
答案 2 :(得分:0)
选项1 使用除以您的年数,然后舍入以设计嵌套的函数调用,这些函数返回所需的YearGroup。这可能会变得凌乱,但有可能
选项2 -在所有sql平台上,最灵活的方法是添加YearGroup表(或视图),其中每个所需组均包含一列
Year | GroupOne | GroupTwo | GroupThree
-----+-----------+----------+-----------
2019 | 2019.1 | 2018.2 | 2019.3
2018 | 2018.1 | 2018.2 | 2016.3
2017 | 2017.1 | 2016.2 | 2016.3
2016 | 2016.1 | 2016.2 | 2016.3
2015 | 2015.1 | 2014.2 | 2015.3
...
小数点是可选的,但可以让人们知道分组中的年数,尽管我想真正的第三范式是分组后的每年一张表
选项2的附加好处是,任何人都可以从YearGroup表中进行选择,以第一手看到映射
您还可以添加具有不同锚定年份的组,例如组两年,第一年为奇数(合并为2017和2018),而第一年为奇数(合并为2018和2019)