本帖最后由 ahboy01 于 2010-12-17 21:42:16 编辑

解决方案 »

  1.   

    http://topic.csdn.net/u/20101216/14/ecfc5920-620b-4961-9275-f6076262d5f2.html
      

  2.   

    http://topic.csdn.net/u/20101216/12/a4fde69e-cb3d-45a0-b8ae-e864ceb6920e.html
      

  3.   

    create table test1
    (
    shipID varchar(10),
    sessionID varchar(10),
    EndDate_N varchar(20),
    EndDate_S varchar(20),
    EndDate_F varchar(20),
    EndDate_X varchar(20)
    )
    drop table test1insert test1(shipID,sessionID,EndDate_N,EndDate_S,EndDate_F,EndDate_X)
     select '1','101','2010-05-06','2010-7-20','2010-7-22','2010-7-21'union
     select '1','102','2010-05-06','2010-7-20','2010-7-22',null union
     select '2','102','2010-05-06','2010-7-20','2010-7-21',null union
     select '3','102','2010-10-06','2010-7-20',null,nullselect shipid,sessionid,convert(varchar(10),max(cast(enddate_n as datetime)),121) from (
    select shipid,sessionid,enddate_n from test1 union all
    select shipid,sessionid,enddate_s from test1 union all
    select shipid,sessionid,enddate_f from test1 union all
    select shipid,sessionid,enddate_x from test1 ) a 
    group by shipid,sessionid/*
    1 101 2010-07-22
    1 102 2010-07-22
    2 102 2010-07-21
    3 102 2010-10-06
    */
      

  4.   

     
     ;WITH cte
     AS
     (
     SELECT shipid,sessionid,[date]
     FROM #test t
     UNPIVOT( [date] FOR EndDate IN([EndDate_N],[EndDate_S],[EndDate_F],[EndDate_X]))upvt
     )
     SELECT shipid,sessionid,EndDate
     FROM 
     (
     SELECT  shipid,sessionid,EndDate =MAX([date])
     FROM cte c
     GROUP BY shipid,sessionid
     )M
     ORDER BY left(EndDate,7),RIGHT(EndDate,2)DESCshipid     sessionid  EndDate
    ---------- ---------- --------------------
    1          101        2010-07-22
    1          102        2010-07-22
    2          102        2010-07-21
    3          102        2010-10-06(4 row(s) affected)
      

  5.   

    呵呵,我也是从别处看到的,觉得挺有趣,本来是想在程序中对数据集进行操作,然后再怎么怎么的,哎,看来是我想的太多了吧,原来也就这么几句SQL
      

  6.   

    create table test
    (
    shipID varchar(10),
    sessionID varchar(10),
    EndDate_N varchar(20),
    EndDate_S varchar(20),
    EndDate_F varchar(20),
    EndDate_X varchar(20)
    )
    insert test(shipID,sessionID,EndDate_N,EndDate_S,EndDate_F,EndDate_X)
     select '1','101','2010-05-06','2010-7-20','2010-7-22','2010-7-21'union
     select '1','102','2010-05-06','2010-7-20','2010-7-22',null union
     select '2','102','2010-05-06','2010-7-20','2010-7-21',null union
     select '3','102','2010-10-06','2010-7-20',null,nullselect shipID,sessionID,max(EndDate) EndDate from
    (
    select shipID,sessionID,convert(varchar(10),cast(EndDate_N as datetime),120) EndDate from test where EndDate_N is not null
    union all
    select shipID,sessionID,convert(varchar(10),cast(EndDate_S as datetime),120) EndDate from test where EndDate_S is not null
    union all
    select shipID,sessionID,convert(varchar(10),cast(EndDate_F as datetime),120) EndDate from test where EndDate_F is not null
    union all
    select shipID,sessionID,convert(varchar(10),cast(EndDate_X as datetime),120) EndDate from test where EndDate_X is not null
    ) t
    group by shipID,sessionID drop table test/*
    shipID     sessionID  EndDate    
    ---------- ---------- ---------- 
    1          101        2010-07-22
    1          102        2010-07-22
    2          102        2010-07-21
    3          102        2010-10-06(所影响的行数为 4 行)
    */