根据SQL Server中的日期合并行

时间:2010-12-03 13:20:13

标签: sql-server

我想根据开始日期和结束日期显示数据。代码可以包含不同的日期。如果任何时间间隔继续,那么我需要合并这些行并显示为单行 这是样本数据

Code  Start_Date   End_Date     Volume
470   24-Oct-10    30-Oct-10    28
470   17-Oct-10    23-Oct-10     2
470   26-Sep-10     2-Oct-10     2
471   22-Aug-10    29-Aug-10     2
471   15-Aug-10    21-Aug-10     2

我想要的输出结果是

Code  Start_Date   End_Date     Volume
470   17-Oct-10    30-Oct-10    30
470   26-Sep-10     2-Oct-10     2
471   15-Aug-10    29-Aug-10     4

代码可以有任何号码。时间的层次。请帮忙。谢谢

2 个答案:

答案 0 :(得分:3)

如果我理解你的要求,你会找到类似的东西:

select code, min(Start_date), max(end_date), sum(volume)
from yourtable
group by code

答案 1 :(得分:3)

基于您的示例数据(我将其放在名为Test的表中),并假设没有重叠:

;with Ranges as (
    select Code,Start_Date,End_Date,Volume from Test
    union all
    select r.Code,r.Start_Date,t.End_Date,(r.Volume + t.Volume)
    from
        Ranges r
            inner join
        Test t
            on
                r.Code = t.Code and
                DATEDIFF(day,r.End_Date,t.Start_Date) = 1
), ExtendedRanges as (
select Code,MIN(Start_Date) as Start_Date,End_Date,MAX(Volume) as Volume
from Ranges
group by Code,End_Date
)
select Code,Start_Date,MAX(End_Date),MAX(Volume)
from ExtendedRanges
group by Code,Start_Date

说明:

范围CTE包含原始表格中的所有行(因为它们中的一些可能是相关的)以及我们可以通过将范围连接在一起形成的所有行(原始范围和我们构建的任何中间范围 - 我们'在这里做递归)。

然后,对于任何特定的End_Date,ExtendedRanges(命名不佳)会找到可以到达它的最早的Start_Date。

最后,我们查询第二个CTE,为任何特定的Start_Date找到与之关联的最新End_Date。

这两个查询结合起来基本上将Ranges CTE过滤到每组重叠日期范围内的“尽可能最大的Start_Date / End_Date对”。

示例数据设置:

create table Test (
    Code int not null,
    Start_Date date not null,
    End_Date date not null,
    Volume int not null
)
insert into Test(Code,  Start_Date,   End_Date,     Volume)
select 470,'24-Oct-10','30-Oct-10',28 union all
select 470,'17-Oct-10','23-Oct-10',2 union all
select 470,'26-Sep-10','2-Oct-10',2 union all
select 471,'22-Aug-10','29-Aug-10',2 union all
select 471,'15-Aug-10','21-Aug-10',2
go