数据库结构如下:
m_sid   ch_type  ch_date            ch_con
101256 上画 2006-09-01 00:00:00 红河实业烟草
101256 下画 2006-11-30 00:00:00 NULL
101302 上画 2006-09-01 00:00:00 红河实业烟草
101302 下画 2006-11-30 00:00:00 NULL
101389 上画 2006-09-01 00:00:00 红河实业烟草
101389 下画 2006-11-30 00:00:00 NULL
101256  下画  2006-10-01 00:00:00 NULL
101256  上画  2006-10-01 00:00:00 白马实业
101302 下画 2006-10-15 00:00:00 NULL
101302  上画  2006-10-15 00:00:00 和记实业 
分析统计: 想要的结果就是下面这种形式的.而且有个判断条件就是: 下画日期要大于统计日期,过期的不要统计.
m_sid    上画日期             下画日期             新广告品牌       原广告品牌
101256   2006-09-01 00:00:00  2006-10-01 00:00:00  红河实业烟草     NULL
101256   2006-10-01 00:00:00  2006-11-30 00:00:00  白马实业         红河实业烟草
101302   2006-09-01 00:00:00  2006-10-15 00:00:00  红河实业烟草     NULL
101302   2006-10-15 00:00:00  2006-11-30 00:00:00  和记实业         红河实业烟草 
101389   2006-09-01 00:00:00  2006-11-30 00:00:00  红河实业烟草     NULL

解决方案 »

  1.   

    create proc pr_test
    @统计日期 datetime
    asselect a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌,a.ch_con as 原广告品牌
    from tablename a,tablename b
    where a.ch_date>@统计日期
    and a.ch_type  ='下画'
    and b.ch_type  ='上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from tablename where m_sid =a.m_sid and ch_type  ='上画' and ch_date<a.ch_date)go--感觉 新广告品牌 原广告品牌 两个字段搞反了,但是例子数据如此,只好这么写了
      

  2.   

    就是找出m_sid的这条记录的上画日期, 下画日期  新广告品牌    原广告品牌  
    就以101256 这条记录来说,它在数据库中对应的有四条记录:
    m_sid     ch_type      ch_date                   ch_con
    101256 上画 2006-09-01 00:00:00 红河实业烟草
    101256 下画 2006-11-30 00:00:00 NULL
    101256   下画     2006-10-01 00:00:00         NULL
    101256   上画     2006-10-01 00:00:00         白马实业我要的结果就是有两条:
    m_sid         上画日期       下画日期            新广告品牌      原广告品牌
    101256        2006-09-01     2006-10-01          红河实业烟草      NULL
    101256        2006-10-01     2006-11-30          白马实业         红河实业烟草数据库中一条上画日期就会对应一条下画日期,现在我就是要把两条记录合并为一条记录..
    而结果就是上面那样.下画日期要大于统计日期,过期的不要
      

  3.   

    m_sid         上画日期       下画日期            新广告品牌      原广告品牌
    101256        2006-09-01     2006-10-01          红河实业烟草      NULL
    101256        2006-10-01     2006-11-30          白马实业         红河实业烟草
    第2条的这个 ‘红河实业烟草’是怎么来的
      

  4.   

    测试算法:declare @t table(
    m_sid   int,
    ch_type  nvarchar(20),
    ch_date  datetime,
    ch_con  nvarchar(50)
    )insert @t select
    101256, '上画', '2006-09-01', '红河实业烟草'
    union all select
    101256, '下画', '2006-11-30', NULL
    union all select
    101302, '上画', '2006-09-01', '红河实业烟草'
    union all select
    101302, '下画', '2006-11-30', NULL
    union all select
    101389, '上画', '2006-09-01', '红河实业烟草'
    union all select
    101389, '下画', '2006-11-30', NULL
    union all select
    101256,  '下画',  '2006-10-01', NULL
    union all select
    101256,  '上画',  '2006-10-01', '白马实业'
    union all select
    101302, '下画', '2006-10-15', NULL
    union all select
    101302,  '上画',  '2006-10-15', '和记实业' 
    declare @统计日期 datetime
    set @统计日期=getdate()select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌,a.ch_con as 原广告品牌
    from @t a,@t b
    where a.ch_date>@统计日期
    and a.ch_type  ='下画'
    and b.ch_type  ='上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type  ='上画' and ch_date<a.ch_date)
    --结果
    m_sid       上画日期                                                   下画日期                                                   新广告品牌                                              原广告品牌                                              
    ----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -------------------------------------------------- 
    101256      2006-09-01 00:00:00.000                                2006-10-01 00:00:00.000                                红河实业烟草                                             NULL
    101302      2006-09-01 00:00:00.000                                2006-10-15 00:00:00.000                                红河实业烟草                                             NULL
    101389      2006-09-01 00:00:00.000                                2006-11-30 00:00:00.000                                红河实业烟草                                             NULL
    101256      2006-10-01 00:00:00.000                                2006-11-30 00:00:00.000                                白马实业                                               NULL
    101302      2006-10-15 00:00:00.000                                2006-11-30 00:00:00.000                                和记实业                                               NULL(所影响的行数为 5 行)
      

  5.   

    测试结果看来 新广告品牌 原广告品牌还是错了declare @t table(
    m_sid   int,
    ch_type  nvarchar(20),
    ch_date  datetime,
    ch_con  nvarchar(50)
    )insert @t select
    101256, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101256, '下画', '2006-11-30', NULL
    union all select
    101302, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101302, '下画', '2006-11-30', NULL
    union all select
    101389, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101389, '下画', '2006-11-30', NULL
    union all select
    101256,  '下画',  '2006-10-01', NULL
    union all select
    101256,  '上画',  '2006-10-01', N'白马实业'
    union all select
    101302, '下画', '2006-10-15', NULL
    union all select
    101302,  '上画',  '2006-10-15', N'和记实业' 
    declare @统计日期 datetime
    set @统计日期=getdate()select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌,
    (select top 1 ch_con from @t where m_sid =b.m_sid and ch_type  ='上画' and ch_date<b.ch_date) as 原广告品牌
    from @t a,@t b
    where a.ch_date>@统计日期
    and a.ch_type  ='下画'
    and b.ch_type  ='上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type  ='上画' and ch_date<a.ch_date)--结果
    m_sid       上画日期                                                   下画日期                                                   新广告品牌                                              原广告品牌                                              
    ----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -------------------------------------------------- 
    101256      2006-09-01 00:00:00.000                                2006-10-01 00:00:00.000                                红河实业烟草                                             NULL
    101302      2006-09-01 00:00:00.000                                2006-10-15 00:00:00.000                                红河实业烟草                                             NULL
    101389      2006-09-01 00:00:00.000                                2006-11-30 00:00:00.000                                红河实业烟草                                             NULL
    101256      2006-10-01 00:00:00.000                                2006-11-30 00:00:00.000                                白马实业                                               红河实业烟草
    101302      2006-10-15 00:00:00.000                                2006-11-30 00:00:00.000                                和记实业                                               红河实业烟草(所影响的行数为 5 行)
      

  6.   

    这里成存储过程  --把tablename还成你自己的表名
    create proc pr_test
    @统计日期 datetime
    asselect a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌,
    (select top 1 ch_con from tablename where m_sid =b.m_sid and ch_type  ='上画' and ch_date<b.ch_date) as 原广告品牌
    from tablename a,tablename b
    where a.ch_date>@统计日期
    and a.ch_type  ='下画'
    and b.ch_type  ='上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from tablename where m_sid =a.m_sid and ch_type  ='上画' and ch_date<a.ch_date)go
      

  7.   

    日期已经考虑了,测试一下语句:declare @t table(
    m_sid   int,
    ch_type  nvarchar(20),
    ch_date  datetime,
    ch_con  nvarchar(50)
    )insert @t select
    101256, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101256, '下画', '2006-11-30', NULL
    union all select
    101302, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101302, '下画', '2006-11-30', NULL
    union all select
    101389, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101389, '下画', '2006-11-30', NULL
    union all select
    101256,  '下画',  '2006-10-01', NULL
    union all select
    101256,  '上画',  '2006-10-01', N'白马实业'
    union all select
    101302, '下画', '2006-10-15', NULL
    union all select
    101302,  '上画',  '2006-10-15', N'和记实业' 
    declare @统计日期 datetime
    set @统计日期='2006-10-1'select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌,
    (select top 1 ch_con from @t where m_sid =b.m_sid and ch_type  ='上画' and ch_date<b.ch_date) as 原广告品牌
    from @t a,@t b
    where a.ch_date>@统计日期
    and a.ch_type  ='下画'
    and b.ch_type  ='上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type  ='上画' and ch_date<a.ch_date)--结果
    m_sid       上画日期                                                   下画日期                                                   新广告品牌                                              原广告品牌                                              
    ----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -------------------------------------------------- 
    101302      2006-09-01 00:00:00.000                                2006-10-15 00:00:00.000                                红河实业烟草                                             NULL
    101389      2006-09-01 00:00:00.000                                2006-11-30 00:00:00.000                                红河实业烟草                                             NULL
    101256      2006-10-01 00:00:00.000                                2006-11-30 00:00:00.000                                白马实业                                               红河实业烟草
    101302      2006-10-15 00:00:00.000                                2006-11-30 00:00:00.000                                和记实业                                               红河实业烟草(所影响的行数为 4 行)
      

  8.   

    declare @t table(m_sid int,ch_type varchar(8),ch_date datetime,ch_con varchar(32))
    insert into @t select 
    101256, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select 
    101256, '下画', '2006-11-30 00:00:00', NULL union all select 
    101302, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select 
    101302, '下画', '2006-11-30 00:00:00', NULL union all select 
    101389, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select 
    101389, '下画', '2006-11-30 00:00:00', NULL union all select 
    101256,  '下画',  '2006-10-01 00:00:00', NULL union all select 
    101256,  '上画',  '2006-10-01 00:00:00', '白马实业' union all select 
    101302, '下画', '2006-10-15 00:00:00', NULL union all select 
    101302,  '上画',  '2006-10-15 00:00:00', '和记实业' 
    --select * from @tselect A.m_sid,A.ch_date [上画日期],B.ch_date [下画日期],A.ch_con [新广告品牌],C.ch_con [原广告品牌]
    from 
    @t A inner join @t B on A.ch_type='上画' and B.ch_type='下画' and A.m_sid=B.m_sid and 
    B.ch_date=(select min(ch_date) from @t where ch_type='下画' and m_sid=A.m_sid and ch_date>=A.ch_date)
    left join @t C on C.ch_type='上画' and C.m_sid=A.m_sid and 
    C.ch_date=(select max(ch_date) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)
    order by A.m_sid
      

  9.   

    zicxc(冒牌邹建 V0.3) 谢谢你的回答,
    不过还是有点不对,那个原广告品牌的取不正确........
    那是要查找出来的..关系就是最临近的一条........
      

  10.   

    写少了order bycreate proc pr_test
    @统计日期 datetime
    asselect a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌,
    (select top 1 ch_con from tablename where m_sid =b.m_sid and ch_type  ='上画' and ch_date<b.ch_date order by ch_date desc) as 原广告品牌
    from tablename a,tablename b
    where a.ch_date>@统计日期
    and a.ch_type  ='下画'
    and b.ch_type  ='上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from tablename where m_sid =a.m_sid and ch_type  ='上画' and ch_date<a.ch_date)go
      

  11.   

    用这些数据就会有错的.........
    101256 上画 2006-09-01 00:00:00 红河实业烟草
    101256 下画 2006-11-30 00:00:00 NULL
    101302 上画 2006-09-01 00:00:00 红河实业烟草
    101302 下画 2006-11-30 00:00:00 NULL
    101256 上画 2006-09-02 00:00:00 没有了
    101256 下画 2006-10-31 00:00:00 NULL
      

  12.   

    declare @t table(
    m_sid   int,
    ch_type  nvarchar(20),
    ch_date  datetime,
    ch_con  nvarchar(50)
    )
    /*
    insert @t select
    101256, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101256, '下画', '2006-11-30', NULL
    union all select
    101302, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101302, '下画', '2006-11-30', NULL
    union all select
    101389, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101389, '下画', '2006-11-30', NULL
    union all select
    101256,  '下画',  '2006-10-01', NULL
    union all select
    101256,  '上画',  '2006-10-01', N'白马实业'
    union all select
    101302, '下画', '2006-10-15', NULL
    union all select
    101302,  '上画',  '2006-10-15', N'和记实业' 
    */insert @t select
    101256, N'上画', '2006-09-01', N'红河实业烟草'
    union all select
    101256, N'下画', '2006-11-30', NULL
    union all select
    101302, N'上画', '2006-09-01', N'红河实业烟草'
    union all select
    101302, N'下画', '2006-11-30', NULL
    union all select
    101256, N'上画', '2006-09-02', N'没有了'
    union all select
    101256, N'下画', '2006-10-31', NULL
    declare @统计日期 datetime
    set @统计日期='2006-1-1'select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌
    ,(select top 1 ch_con from @t where m_sid =b.m_sid and ch_type  ='上画' and ch_date<b.ch_date) as 原广告品牌
    from @t a,@t b
    where a.ch_date>@统计日期
    and a.ch_type  =N'下画'
    and b.ch_type  =N'上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type  =N'上画' and ch_date<a.ch_date)--结果
    m_sid       上画日期                                                   下画日期                                                   新广告品牌                                              原广告品牌                                              
    ----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -------------------------------------------------- 
    101302      2006-09-01 00:00:00.000                                2006-11-30 00:00:00.000                                红河实业烟草                                             NULL
    101256      2006-09-02 00:00:00.000                                2006-11-30 00:00:00.000                                没有了                                                NULL
    101256      2006-09-02 00:00:00.000                                2006-10-31 00:00:00.000                                没有了                                                NULL(所影响的行数为 3 行)
      

  13.   

    101256 上画 2006-09-01 00:00:00 红河实业烟草
    101256 下画 2006-11-30 00:00:00 NULL
    101256 上画 2006-09-02 00:00:00 没有了
    101256 下画 2006-10-31 00:00:00 NULL101256的数据按日期排序如下101256 上画 2006-09-01 00:00:00 红河实业烟草
    101256 上画 2006-09-02 00:00:00 没有了
    101256 下画 2006-10-31 00:00:00 NULL
    101256 下画 2006-11-30 00:00:00 NULL 两次上画连续,两次下画连续,按我的理解,数据是错误的
      

  14.   

    101302 2006-09-01  2006-11-30  红河实业烟草 NULL
    101256 2006-09-02  2006-11-30  没有了 红河实业烟草
    101256 2006-09-02  2006-10-31  没有了 红河实业烟草用上面的测试数据得出的结果是上面的,那个101256有个的上画日期是2006-09-01 
     请你再看一下.......谢谢...........
      

  15.   

    晕,我的测试程序没改,加order by 
    还有,因为我用了nvarchar所以'下画'要改成 N'下画'declare @t table(
    m_sid   int,
    ch_type  nvarchar(20),
    ch_date  datetime,
    ch_con  nvarchar(50)
    )
    /*
    insert @t select
    101256, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101256, '下画', '2006-11-30', NULL
    union all select
    101302, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101302, '下画', '2006-11-30', NULL
    union all select
    101389, '上画', '2006-09-01', N'红河实业烟草'
    union all select
    101389, '下画', '2006-11-30', NULL
    union all select
    101256,  '下画',  '2006-10-01', NULL
    union all select
    101256,  '上画',  '2006-10-01', N'白马实业'
    union all select
    101302, '下画', '2006-10-15', NULL
    union all select
    101302,  '上画',  '2006-10-15', N'和记实业' 
    */insert @t select
    101256, N'上画', '2006-09-01', N'红河实业烟草'
    union all select
    101256, N'下画', '2006-11-30', NULL
    union all select
    101302, N'上画', '2006-09-01', N'红河实业烟草'
    union all select
    101302, N'下画', '2006-11-30', NULL
    union all select
    101256, N'上画', '2006-09-02', N'没有了'
    union all select
    101256, N'下画', '2006-10-31', NULL
    declare @统计日期 datetime
    set @统计日期='2006-1-1'select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌
    ,(select top 1 ch_con from @t where m_sid =b.m_sid and ch_type  =N'上画' and ch_date<b.ch_date order by ch_date desc) as 原广告品牌
    from @t a,@t b
    where a.ch_date>@统计日期
    and a.ch_type  =N'下画'
    and b.ch_type  =N'上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type  =N'上画' and ch_date<a.ch_date)--结果
    m_sid       上画日期                                                   下画日期                                                   新广告品牌                                              原广告品牌                                              
    ----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -------------------------------------------------- 
    101302      2006-09-01 00:00:00.000                                2006-11-30 00:00:00.000                                红河实业烟草                                             NULL
    101256      2006-09-02 00:00:00.000                                2006-11-30 00:00:00.000                                没有了                                                红河实业烟草
    101256      2006-09-02 00:00:00.000                                2006-10-31 00:00:00.000                                没有了                                                红河实业烟草(所影响的行数为 3 行)
      

  16.   

    101256 上画 2006-09-01 00:00:00 红河实业烟草
    101256 下画 2006-11-30 00:00:00 NULL
    101302 上画 2006-09-01 00:00:00 红河实业烟草
    101302 下画 2006-11-30 00:00:00 NULL
    101256 上画 2006-09-02 00:00:00 没有了
    101256 下画 2006-09-02 00:00:00 NULL
    数据是有错,用这些........测试出来的结果也不对啊........
      

  17.   

    用这个测试一下--把@t 换成你的表名
    declare @统计日期 datetime
    set @统计日期='2006-9-1'
    select A.m_sid,A.ch_date [上画日期],B.ch_date [下画日期],A.ch_con [新广告品牌],C.ch_con [原广告品牌]
    from 
    @t A inner join @t B on A.ch_type='上画' and B.ch_type='下画' and A.m_sid=B.m_sid and 
    B.ch_date=(select min(ch_date) from @t where ch_type='下画' and m_sid=A.m_sid and ch_date>=A.ch_date)
    left join @t C on C.ch_type='上画' and C.m_sid=A.m_sid and 
    C.ch_date=(select max(ch_date) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)
    where A.ch_date>=@统计日期 
    order by A.m_sid
      

  18.   


    declare @t table(
    m_sid   int,
    ch_type  nvarchar(20),
    ch_date  datetime,
    ch_con  nvarchar(50)
    )insert @t select
    101256, N'上画', '2006-09-01', N'红河实业烟草'
    union all select
    101256, N'下画', '2006-11-30', NULL
    union all select
    101302, N'上画', '2006-09-01', N'红河实业烟草'
    union all select
    101302, N'下画', '2006-11-30', NULL
    union all select
    101256, N'上画', '2006-09-02', N'没有了'
    union all select
    101256, N'下画', '2006-09-02', NULL
    declare @统计日期 datetime
    set @统计日期='2006-1-1'select a.m_sid,b.ch_date as 上画日期,a.ch_date as 下画日期,b.ch_con as 新广告品牌
    ,(select top 1 ch_con from @t where m_sid =b.m_sid and ch_type  =N'上画' and ch_date<b.ch_date order by ch_date desc) as 原广告品牌
    from @t a,@t b
    where a.ch_date>@统计日期
    and a.ch_type  =N'下画'
    and b.ch_type  =N'上画'
    and a.m_sid =b.m_sid 
    and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type  =N'上画' and ch_date<a.ch_date)--结果
    m_sid       上画日期                                                   下画日期                                                   新广告品牌                                              原广告品牌                                              
    ----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -------------------------------------------------- 
    101256      2006-09-01 00:00:00.000                                2006-09-02 00:00:00.000                                红河实业烟草                                             NULL
    101302      2006-09-01 00:00:00.000                                2006-11-30 00:00:00.000                                红河实业烟草                                             NULL
    101256      2006-09-02 00:00:00.000                                2006-11-30 00:00:00.000                                没有了                                                红河实业烟草(所影响的行数为 3 行)
      

  19.   

    and b.ch_date=(select max(ch_date) from @t where m_sid =a.m_sid and ch_type  =N'上画' and ch_date<a.ch_date)
    因为可能是同一天,所以感觉用ch_date<=a.ch_date 更准确
      

  20.   

    这样试试:
    if object_id('tempdb..#tmp') is not null
        drop table #tmp
    GO
    ----创建测试数据
    declare @t table(m_sid int,ch_type varchar(10),ch_date datetime,ch_con varchar(50))
    insert @t
    select 101256,'上画','2006-09-01 00:00:00','红河实业烟草' union all
    select 101256,'下画','2006-11-30 00:00:00',NULL union all
    select 101302,'上画','2006-09-01 00:00:00','红河实业烟草' union all
    select 101302,'下画','2006-11-30 00:00:00',NULL union all
    select 101389,'上画','2006-09-01 00:00:00','红河实业烟草' union all
    select 101389,'下画','2006-11-30 00:00:00',NULL union all
    select 101256,'下画','2006-10-01 00:00:00',NULL union all
    select 101256,'上画','2006-10-01 00:00:00','白马实业' union all
    select 101302,'下画','2006-10-15 00:00:00',NULL union all
    select 101302,'上画','2006-10-15 00:00:00','和记实业'----设置截止日期
    declare @EndDate datetime
    set @EndDate = '2006-12-31'----生成临时表
    select *,
    GroupID = (select count(1) from @t where m_sid = a.m_sid and ch_date < a.ch_date and ch_type=a.ch_type),
    原广告品牌 = (select top 1 ch_con from @t where m_sid = a.m_sid and ch_date < a.ch_date and a.ch_type = '上画' order by m_sid,ch_date ) 
    into #tmp from @t a where ch_date <= @EndDate
    order by m_sid,ch_date ----汇总
    select m_sid,
    上画日期 = max(case ch_type when '上画' then ch_date end),
    下画日期 = max(case ch_type when '下画' then ch_date end),
    新广告品牌 = max(case ch_type when '上画' then ch_con end),
    原广告品牌 = max(case ch_type when '上画' then 原广告品牌 end)
    from #tmp group by m_sid,GroupID order by m_sid----清除测试环境
    drop table #tmp
      

  21.   

    101256  2006-09-01 00:00:00 2006-09-02 00:00:00 红河实业烟草 NULL
    101256  2006-09-02 00:00:00 2006-09-02 00:00:00 没有了 红河实业烟草
    101302  2006-09-01 00:00:00 2006-11-30 00:00:00 红河实业烟草 NULL 这是zsforever(虎虎)的结果..就是那个101256第二条的记录的下画日期错了..........再看看吧.......
      

  22.   

    declare @t table(m_sid int,ch_type varchar(8),ch_date datetime,ch_con varchar(32))
    insert into @t select 
    101256, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select 
    101256, '下画', '2006-11-30 00:00:00', NULL union all select 
    101302, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select 
    101302, '下画', '2006-11-30 00:00:00', NULL union all select 
    101389, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select 
    101389, '下画', '2006-11-30 00:00:00', NULL union all select 
    101256,  '下画',  '2006-10-01 00:00:00', NULL union all select 
    101256,  '上画',  '2006-10-01 00:00:00', '白马实业' union all select 
    101302, '下画', '2006-10-15 00:00:00', NULL union all select 
    101302,  '上画',  '2006-10-15 00:00:00', '和记实业' 
    --select * from @t
    declare @统计日期 datetime
    set @统计日期='2006-9-1'
    select A.m_sid,A.ch_date [上画日期],B.ch_date [下画日期],A.ch_con [新广告品牌],C.ch_con [原广告品牌]
    from 
    @t A inner join @t B on A.ch_type='上画' and B.ch_type='下画' and A.m_sid=B.m_sid and 
    B.ch_date=(select min(ch_date) from @t where ch_type='下画' and m_sid=A.m_sid and ch_date>=A.ch_date)
    left join @t C on C.ch_type='上画' and C.m_sid=A.m_sid and 
    C.ch_date=(select max(ch_date) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)
    where A.ch_date>=@统计日期 
    order by A.m_sid
    --结果(所影响的行数为 10 行)m_sid       上画日期                                                   下画日期                                                   新广告品牌                            原广告品牌                            
    ----------- ------------------------------------------------------ ------------------------------------------------------ -------------------------------- -------------------------------- 
    101256      2006-09-01 00:00:00.000                                2006-10-01 00:00:00.000                                红河实业烟草                           NULL
    101256      2006-10-01 00:00:00.000                                2006-10-01 00:00:00.000                                白马实业                             红河实业烟草
    101302      2006-09-01 00:00:00.000                                2006-10-15 00:00:00.000                                红河实业烟草                           NULL
    101302      2006-10-15 00:00:00.000                                2006-10-15 00:00:00.000                                和记实业                             红河实业烟草
    101389      2006-09-01 00:00:00.000                                2006-11-30 00:00:00.000                                红河实业烟草                           NULL(所影响的行数为 5 行)
      

  23.   

    101256 上画 2006-09-01 00:00:00 红河实业烟草
    101256 下画 2006-11-30 00:00:00 NULL
    101302 上画 2006-09-01 00:00:00 红河实业烟草
    101302 下画 2006-11-30 00:00:00 NULL
    101256 上画 2006-09-02 00:00:00 没有了
    101256 下画 2006-09-02 00:00:00 NULL原始记录
      

  24.   

    declare @t table(m_sid int,ch_type varchar(8),ch_date datetime,ch_con varchar(32))
    insert into @t select 
    101256, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select
    101256, '下画', '2006-11-30 00:00:00', NULL union all select
    101302, '上画', '2006-09-01 00:00:00', '红河实业烟草' union all select
    101302, '下画', '2006-11-30 00:00:00', NULL union all select
    101256, '上画', '2006-09-02 00:00:00', '没有了' union all select
    101256, '下画', '2006-09-02 00:00:00', NULL
    --select * from @t
    declare @统计日期 datetime
    set @统计日期='2006-9-1'
    select A.m_sid,A.ch_date [上画日期],B.ch_date [下画日期],A.ch_con [新广告品牌],C.ch_con [原广告品牌]
    from 
    @t A inner join @t B on A.ch_type='上画' and B.ch_type='下画' and A.m_sid=B.m_sid and 
    (select count(1) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)=
    (select count(1) from @t where ch_type='下画' and m_sid=A.m_sid and ch_date<B.ch_date)
    left join @t C on C.ch_type='上画' and C.m_sid=A.m_sid and 
    C.ch_date=(select max(ch_date) from @t where ch_type='上画' and m_sid=A.m_sid and ch_date<A.ch_date)
    where A.ch_date>=@统计日期 
    order by A.m_sid
      

  25.   

    如果同m_sid的上画和上画、下画和下画的时间都不相同这个可以了,
    但这样的数据结构怎么看怎么别扭
      

  26.   

    俺也是(邹建)的大FANS
    呵呵