动态分组数据||需要SQL查询

时间:2019-07-07 19:01:28

标签: sql sql-server

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

无硬编码

3 个答案:

答案 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 functioncase创建了一个到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)