,sql中某列日期存在空值则取空值如果不存在空值,则取最大日期

求助,sql中某列日期存在空值则取空值如果不存在空值,则取最大日期
求助:如题
在sql中某列日期存在空值则取空值如果不存在空值,则取最大日期;
实例数据如下

FBillno          FDate         FCheckdate        WorkNo       wfdate        wfcheckdate     fnumber      poorderNo     Pfdate      Pfcheckdate  
GS15001    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0003   PO201501   2015-01-15   2015-01-16
GS15001    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0004   PO201501   2015-01-16   2015-01-20
GS15001    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0005   PO201501          null                   null
GS15001    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0006   PO201501   2015-01-18   2015-01-22
GS15002    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0007   PO201501   2015-01-15   2015-01-16
GS15002    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0007   PO201501   2015-01-15   2015-01-20


得到如下结果
FBillno          FDate         FCheckdate        WorkNo       wfdate        wfcheckdate     fnumber      poorderNo     Pfdate      Pfcheckdate  
GS15001    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0003   PO201501           null    null
GS15002    2015-01-02     2015-01-03    W201501  2015-01-04   2015-01-10    1.01.0007   PO201501   2015-01-15   2015-01-20


其实意思就是  从销售订单开始,生产任务单, 采购订单,入库时间  四个阶段都有完成的节点,统计销售订单各个环节所需时间,只要某一时间点无时间信息就是空,有时间则取最大时间; 多行数据并成一列!
------解决思路----------------------
简化结果后的语句,看看是不是你想要的。
with table1 as
(
select 'GS15001' FBillno, '2015-01-15' Pfdate, '2015-01-16' Pfcheckdate union all
select 'GS15001' FBillno, '2015-01-16' Pfdate, '2015-01-20' Pfcheckdate union all
select 'GS15001' FBillno, null Pfdate, null Pfcheckdate union all
select 'GS15002' FBillno, '2015-01-15' Pfdate, '2015-01-16' Pfcheckdate union all
select 'GS15002' FBillno, '2015-01-15' Pfdate, '2015-01-20' Pfcheckdate
)
select FBillno
, case when MAX(case when pfdate is null then '2099-12-31' else Pfdate end) = '2099-12-31' then null else MAX(case when pfdate is null then '2099-12-31' else Pfdate end) end Pfdate
, case when MAX(case when Pfcheckdate is null then '2099-12-31' else Pfcheckdate end) = '2099-12-31' then null else MAX(case when Pfcheckdate is null then '2099-12-31' else Pfcheckdate end) end Pfdate
from table1 
group by FBillno

------解决思路----------------------


with cte(FBillno,FDate,FCheckdate,WorkNo,wfdate,wfcheckdate,fnumber,poorderNo,Pfdate,Pfcheckdate) as 

select 'GS15001','2015-01-02','2015-01-03','W201501','2015-01-04','2015-01-10','1.01.0003','PO201501','2015-01-15','2015-01-16'
union all select 'GS15001','2015-01-02','2015-01-03','W201501','2015-01-04','2015-01-10','1.01.0004','PO201501','2015-01-16','2015-01-20'
union all select 'GS15001','2015-01-02','2015-01-03','W201501','2015-01-04','2015-01-10','1.01.0005','PO201501',null,null
union all select 'GS15001','2015-01-02','2015-01-03','W201501','2015-01-04','2015-01-10','1.01.0006','PO201501','2015-01-18','2015-01-22'
union all select 'GS15002','2015-01-02','2015-01-03','W201501','2015-01-04','2015-01-10','1.01.0007','PO201501','2015-01-15','2015-01-16'
union all select 'GS15002','2015-01-02','2015-01-03','W201501','2015-01-04','2015-01-10','1.01.0007','PO201501','2015-01-15','2015-01-20'
)
,cte1 as
(
select row_number()over(partition by FBillno,FDate,FCheckdate,WorkNo,wfdate,wfcheckdate,poorderNo order by (case when Pfdate is null then cast('9999-12-31' as datetime) else cast(Pfdate as datetime) end) desc) as Pfdate_Number
,row_number()over(partition by FBillno,FDate,FCheckdate,WorkNo,wfdate,wfcheckdate,poorderNo order by (case when Pfcheckdate is null then cast('9999-12-31' as datetime) else cast(Pfcheckdate as datetime) end) desc) as Pfcheckdate_Number
,*
from cte
)
select FBillno,FDate,FCheckdate,WorkNo,wfdate,wfcheckdate,MIN(fnumber) as fnumber,poorderNo,MAX(case when Pfdate_Number=1 then Pfdate end ) as Pfdate,MAX(case when Pfcheckdate_Number=1 then Pfcheckdate end) as Pfcheckdate
from cte1
group by FBillno,FDate,FCheckdate,WorkNo,wfdate,wfcheckdate,poorderNo

/**

FBillno FDate      FCheckdate WorkNo  wfdate     wfcheckdate fnumber   poorderNo Pfdate     Pfcheckdate
------- ---------- ---------- ------- ---------- ----------- --------- --------- ---------- -----------
GS15001 2015-01-02 2015-01-03 W201501 2015-01-04 2015-01-10  1.01.0003 PO201501  NULL       NULL
GS15002 2015-01-02 2015-01-03 W201501 2015-01-04 2015-01-10  1.01.0007 PO201501  2015-01-15 2015-01-20
Warning: Null value is eliminated by an aggregate or other SET operation.

(2 行受影响)

**/


------解决思路----------------------
    SELECT FBillno,
           CASE WHEN COUNT(*)<>COUNT(Pfdate) 
                THEN NULL
                ELSE MAX(Pfdate)
           END Pfdate,
           ... -- 需要NULL的字段都按照上面的方式写
      FROM table1 
  GROUP BY FBillno