首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

聚合的SQL该如何写

2013-11-15 
求一个聚合的SQL该怎么写有这样的数据员工开始日期终了日期A2013-05-01 00:00:00.0002013-06-08 00:00:00.

求一个聚合的SQL该怎么写
有这样的数据
员工    开始日期                     终了日期
A       2013-05-01 00:00:00.000      2013-06-08 00:00:00.000
A       2013-09-02 00:00:00.000      2013-12-31 00:00:00.000
A       2013-09-05 00:00:00.000      NULL

求员工A的所能表示的最大范围的日期,取日期的并集,最后结果应该如下:
员工    开始日期                     终了日期
A       2013-05-01 00:00:00.000      2013-06-08 00:00:00.000
A       2013-09-02 00:00:00.000      NULL

请问谁知道这样的SQL语句该如何写
SQL,并集
[解决办法]

引用:
Quote: 引用:

是这样吗:
;with t(员工 , 开始日期,终了日期)
as
(
select 'A', '2013-05-01 00:00:00.000','2013-06-08 00:00:00.000'
union all select 'A','2013-09-02 00:00:00.000','2013-12-31 00:00:00.000'
union all select 'A','2013-09-05 00:00:00.000',NULL
)


select 员工,开始日期,nullif(MAX(终了日期),'3000-01-01') 终了日期
from 
(
select t1.员工,
       t1.开始日期,
       case when t2.终了日期 < t1.终了日期 
                 then t1.终了日期
            when t2.终了日期 is null
                 then '3000-01-01'
            else t2.终了日期
       end 终了日期     
        
from t t1
inner join t t2
       on t1.员工 = t2.员工
          and t2.开始日期 between t1.开始日期 and t1.终了日期
)tt
group by 员工,开始日期
/*
员工开始日期                 终了日期
A2013-05-01 00:00:00.0002013-06-08 00:00:00.000
A2013-09-02 00:00:00.000NULL
*/


对于上面的数据可以,但是如果再添加一条数据上面代码就不行了:

员工开始日期                 终了日期
A2013-09-15 00:00:00.0002013-11-08 00:00:00.000

加上面数据后没有进行合并


呵呵,上面的确实有点问题,改了一下,你再试试:
;with t(员工 , 开始日期,终了日期)
as
(
select 'A', '2013-05-01 00:00:00.000','2013-06-08 00:00:00.000'
union all select 'A','2013-09-02 00:00:00.000','2013-12-31 00:00:00.000'
union all select 'A','2013-09-05 00:00:00.000',NULL
union all select 'A','2013-09-15 00:00:00.000','2013-11-08 00:00:00.000'
),

tt
as
(
select 员工,开始日期,终了日期,
       (select MIN(t2.开始日期)
        from t t2
        where t1.员工 = t2.员工
              and t1.开始日期 between t2.开始日期 and isnull(t2.终了日期,'3000-01-01')
       ) as min_开始日期,
       
       (select max(isnull(t2.终了日期,'3000-01-01'))
        from t t2
        where t1.员工 = t2.员工
              and t1.开始日期 between t2.开始日期 and isnull(t2.终了日期,'3000-01-01')
       ) as max_终了日期    
from t t1
)

select 员工,min_开始日期 as 开始日期,
       nullif(max(max_终了日期),'3000-01-01') as  终了日期
from tt
group by 员工,min_开始日期
/*
员工 开始日期                 终了日期
A 2013-05-01 00:00:00.0002013-06-08 00:00:00.000


A 2013-09-02 00:00:00.000NULL
*/


热点排行