declare @test table(CBMCU char(6),CBAN8 char(6),CBLITM char(15),CBCRCD char(3),CBUOM char(2), CBUORG char(1),StartDate datetime,EndDate datetime)
insert @test select '381001','110995','02250044-275','USD','EA','1','2008-10-20','2009-04-30'
union all
select '381001','110995','02250044-716','USD','EA','1','2008-10-20','2009-04-30'
union all 
select '381001','110995','02250044-058','USD','EA','1','2008-10-20','2009-04-30'
union all
select '381001','110995','02250044-058','USD','EA','1','2009-03-20','2010-04-30'
union all
select '381001','110995','02250044-058','USD','EA','1','2010-03-20','2010-12-30'
union all
select '381001','110995','02250044-069','USD','EA','1','2008-10-20','2009-12-30'
union all
select '381001','110995','02250044-069','USD','EA','1','2009-02-26','2010-12-30'
union all
select '381002','110995','02250044-078','USD','EA','1','2008-10-20','2009-04-30'
union all
select '381100','110995','02250044-098','USD','EA','1','2008-10-20','2009-04-30'对同一个CBMCU,同一个CBAN8,同一个CBLITM,如果存在两条以上的记录,需要判断这些记录‘StartDate’与‘EndDate’有没有交集,如果有,则把所有这些记录取出来可能会存在的难点:对同一个CBMCU,同一个CBAN8,同一个CBLITM,如果存在三条以上的记录,在做判断的时候可能要考虑循环判断

解决方案 »

  1.   

    看看结果对不对
    declare @test table(CBMCU char(6),CBAN8 char(6),CBLITM char(15),CBCRCD char(3),CBUOM char(2), CBUORG char(1),StartDate datetime,EndDate datetime)
    insert @test select '381001','110995','02250044-275','USD','EA','1','2008-10-20','2009-04-30'
    union all
    select '381001','110995','02250044-716','USD','EA','1','2008-10-20','2009-04-30'
    union all 
    select '381001','110995','02250044-058','USD','EA','1','2008-10-20','2009-04-30'
    union all
    select '381001','110995','02250044-058','USD','EA','1','2009-03-20','2010-04-30'
    union all
    select '381001','110995','02250044-058','USD','EA','1','2010-03-20','2010-12-30'
    union all
    select '381001','110995','02250044-069','USD','EA','1','2008-10-20','2009-12-30'
    union all
    select '381001','110995','02250044-069','USD','EA','1','2009-02-26','2010-12-30'
    union all
    select '381002','110995','02250044-078','USD','EA','1','2008-10-20','2009-04-30'
    union all
    select '381100','110995','02250044-098','USD','EA','1','2008-10-20','2009-04-30'SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY CBMCU) 'ID',* FROM @TEST) T1
    WHERE EXISTS(
    SELECT 1 FROM (SELECT ROW_NUMBER() OVER(ORDER BY CBMCU) 'ID',* FROM @TEST) T2 WHERE T2.CBMCU=T1.CBMCU AND T2.CBLITM=T1.CBLITM AND T2.CBAN8=T1.CBAN8
    AND (T2.StartDate BETWEEN T1.StartDate AND T1.EndDate OR T2.ENDDate BETWEEN T1.StartDate AND T1.EndDate
    OR T1.StartDate BETWEEN T2.StartDate AND T2.EndDate OR T1.ENDDate BETWEEN T2.StartDate AND T2.EndDate)
    AND T2.ID<>T1.ID
    )
    /*
    ID                   CBMCU  CBAN8  CBLITM          CBCRCD CBUOM CBUORG StartDate               EndDate
    -------------------- ------ ------ --------------- ------ ----- ------ ----------------------- -----------------------
    3                    381001 110995 02250044-058    USD    EA    1      2008-10-20 00:00:00.000 2009-04-30 00:00:00.000
    4                    381001 110995 02250044-058    USD    EA    1      2009-03-20 00:00:00.000 2010-04-30 00:00:00.000
    5                    381001 110995 02250044-058    USD    EA    1      2010-03-20 00:00:00.000 2010-12-30 00:00:00.000
    6                    381001 110995 02250044-069    USD    EA    1      2008-10-20 00:00:00.000 2009-12-30 00:00:00.000
    7                    381001 110995 02250044-069    USD    EA    1      2009-02-26 00:00:00.000 2010-12-30 00:00:00.000
    */
      

  2.   

    恩,是对的,下面这样会不会简单些select * from @test t
    where exists(select 1 from @test
                where CBMCU=t.CBMCU and CBAN8=t.CBAN8 and CBLITM=t.CBLITM and id<>t.id
                and ((StartDate between t.StartDate and t.EndDate) or (EndDate between t.StartDate and t.EndDate) or (StartDate < t.StartDate and EndDate>t.EndDate))
                )
      

  3.   

    可以对测试数据 CBMCU,CBAN8,CBLITM,StartDate进行排序,然后加入序号,在处理应该简单些
    非常感谢