大家好,我现有个需求,表结构如下:
ID,床位名称,姓名 开始日期         结束日期       结束原因
1.   2201    张三 20131101      20131108       不适应
2    2202     张三  20131109      至今           XXXx
如何通过,sql 实现以下功能:
序号      变化描述           时间                        原因
 1       2201 =2002      20131108 --  20131109 不适应。
谢谢 

解决方案 »

  1.   

    是这样吗:
    --drop table tbcreate table tb
    (
    ID int,
    床位名称 varchar(20),
    姓名 varchar(20),
    开始日期 varchar(20),        
    结束日期 varchar(20),      
    结束原因 varchar(20)
    )insert into tb
    select 1,   '2201', '张三', '20131101', '20131108','不适应' union all
    select 2,   '2202', '张三', '20131109', '至今'    ,'XXXx'
    go
    select min(t1.ID) as id,
           min(t1.床位名称) +isnull('='+max(t2.床位名称),'') as 变化描述,
           min(t1.结束日期) + ISNULL('-'+MAX(t1.开始日期),'') as 时间,
           min(t1.结束原因) as 原因
    from tb t1
    inner join tb t2
           on t1.姓名 = t2.姓名
              and t1.ID < t2.ID
    group by t1.姓名
    /*
    id 变化描述     时间                  原因
    1 2201=2202 20131108-20131101 不适应
    */
      

  2.   

     if object_id('tempdb..#aa','u') is not null
    drop table #aa
    go
    create table #aa
    (
    ID int,
    床位名称 varchar(20),
    姓名 varchar(20),
    开始日期 varchar(20),        
    结束日期 varchar(20),      
    结束原因 varchar(20)
    )
     
    insert into #aa
    select 1,   '2201', '张三', '20131101', '20131108','不适应' union all
    select 2,   '2202', '张三', '20131109', '至今'    ,'XXXx'
    go
     
    select a.id , a.床位名称+'='+b.床位名称 as 变化描述 ,
                  a.结束日期+'-'+b.开始日期  as 时间 ,
                                  a.结束原因  as 原因 
            from #aa a inner join  #aa b on b.id>a.id
    /* id   变化描述     时间                原因
       1 2201=2202 20131108-20131109 不适应
    */
     
      

  3.   

    if object_id('tempdb..#aa','u') is not null
    drop table #aa
    go
    create table #aa
    (
    ID int,
    床位名称 varchar(20),
    姓名 varchar(20),
    开始日期 varchar(20),        
    结束日期 varchar(20),      
    结束原因 varchar(20)
    )
     
    insert into #aa
    select 1,   '2201', '张三', '20131101', '20131108','不适应' union all
    select 2,   '2202', '张三', '20131109', '20130010'   ,'很不适应' union all
    select 3,   '2203', '张三',  '20131111', '至今' ,  'XXXxx'    union all
    select 4,   '2204', '李四', '20131109', '20130010'   ,'很不适应' union all
    select 5,   '2205', '李四',  '20131111', '至今' ,  'XXXxx' 
    go
     
    select Max(a.id)as 序号 , Max(a.床位名称)+'='+min(b.床位名称) as 变化描述 ,
                  Max(a.结束日期)+'-'+min(b.开始日期 ) as 时间 ,
                                  Max(a.结束原因)  as 原因 
            from #aa a inner join  #aa b on b.id>a.id and a.姓名=b.姓名
       group by a.床位名称 /*
    序号  变化描述      时间            原因1 2201=2202 20131108-20131109 不适应
    2 2202=2203 20130010-20131111 很不适应
    4 2204=2205 20130010-20131111 很不适应
    */