DATEDIFF 总是在上次交互中向我发送 Null 结果

DATEDIFF always sends me a Null result in the last interaction

我真的需要你的帮助来解决以下问题。我有以下查询:

SELECT 
Country,
CRM_OBJ_ID as "Service_Order_ID",
"CRM_NUMINT" as "Service_Order_Line",
nullif(CRM_CRD_AT,'') as "Service_Order_Creation_Date",
--nullif(ZDAT_PO,'') as "Part_Order_Release_Date",

NULLIF(ERDAT,'') as "Item_Creation_Date",
NULLIF("SHPFR_DATE",'') as "Shipped_Date",
NULLIF("ACT_DATE",'') as "Delivered_Date",

DATEDIFF(day,iif(max("ACT_DATE") over (PARTITION BY CRM_OBJ_ID)='',
                    IIF(max("SHPFR_DATE") over(PARTITION BY CRM_OBJ_ID)='',
                        IIF(max(ERDAT) over(PARTITION BY CRM_OBJ_ID) is null,max("CRM_CRD_AT") over(PARTITION BY CRM_OBJ_ID),max(ERDAT) over(PARTITION BY CRM_OBJ_ID)),                             
                    max("SHPFR_DATE") over(PARTITION BY CRM_OBJ_ID)),
                max("ACT_DATE") over (PARTITION BY CRM_OBJ_ID)),
        GETDATE()) as dif

FROM ZOH_SVS43_IDL

LEFT JOIN ZO_SDA05_IDL ON ZOH_SVS43_IDL.CRM_OBJ_ID=ZO_SDA05_IDL.VBELN and ZOH_SVS43_IDL.CRM_NUMINT=ZO_SDA05_IDL.POSNR

where CRM_OBJ_ID in ('7008097791','7007987492','7008002892','7008097849')

Group by Country,CRM_OBJ_ID,CRM_NUMINT,CRM_CRD_AT,ZDAT_OCMP,ERDAT,SHPFR_DATE,ACT_DATE,CSM_CLDA,ZDAT_PO

Order by Country,CRM_OBJ_ID,CRM_NUMINT

结果是

Country service_order   Line    Create_Date Item_Creation_Date  Shipped_Date    Delivered_Date  Today() Dif
CL  7007987492  10  5/2/2017    NULL    NULL    NULL    7/8/2017    65
CL  7007987492  20  5/2/2017    5/2/2017    5/3/2017    5/5/2017    7/8/2017    65
MX  7008002892  0   5/11/2017   NULL    NULL    NULL    7/8/2017    41
MX  7008002892  20  5/11/2017   5/29/2017   NULL    NULL    7/8/2017    41
MX  7008097791  10  7/4/2017    7/4/2017    NULL    NULL    7/8/2017    4
MX  7008097791  20  7/4/2017    7/4/2017    7/5/2017    NULL    7/8/2017    4
MX  7008097849  10  7/4/2017    NULL    NULL    NULL    7/8/2017    NULL

我想做的是计算 btw dates 的差异,以获得最后状态 - 今天。

逻辑是,如果Delivered为null,则查找Shipped,如果为null,则查找Item creation date,如果此字段为null,则查找创建日期。

正确的结果一定是

Country service_order   Line    Create_Date Item_Creation_Date  Shipped_Date    Delivered_Date  Today() Dif
CL  7007987492  10  5/2/2017    NULL    NULL    NULL    7/8/2017    65
CL  7007987492  20  5/2/2017    5/2/2017    5/3/2017    5/5/2017    7/8/2017    65
MX  7008002892  0   5/11/2017   NULL    NULL    NULL    7/8/2017    41
MX  7008002892  20  5/11/2017   5/29/2017   NULL    NULL    7/8/2017    41
MX  7008097791  10  7/4/2017    7/4/2017    NULL    NULL    7/8/2017    4
MX  7008097791  20  7/4/2017    7/4/2017    7/5/2017    NULL    7/8/2017    4
MX  7008097849  10  7/4/2017    NULL    NULL    NULL    7/8/2017    4

非常感谢任何指导或回答,在此先感谢您。

根据您声明的关于日期列使用优先顺序的逻辑来获取日期差异,您可以使用 COALESCE 函数来获取第一个非空值。

使用您的 "correct" 结果集,我将这些值插入到临时 table 中,作为展示如何将 COALESCE 函数与 DATEDIFF 一起使用的快速方法。这是示例脚本:

IF OBJECT_ID('tempdb..#Orders') IS NOT NULL
   BEGIN
      DROP TABLE #ORders;
   END;

CREATE TABLE #Orders
   (
      Country            VARCHAR(2)
    , service_order      BIGINT
    , Line               INT
    , Create_Date        DATE
    , Item_Creation_Date DATE
    , Shipped_Date       DATE
    , Delivered_Date     DATE
    , Today              DATE
   );

INSERT INTO #Orders (
                       Country
                     , service_order
                     , Line
                     , Create_Date
                     , Item_Creation_Date
                     , Shipped_Date
                     , Delivered_Date
                     , Today
                    )
VALUES ('CL', 7007987492, 10, '5/2/2017', NULL, NULL, NULL, '7/8/2017')
     , ('CL', 7007987492, 20, '5/2/2017', '5/2/2017', '5/3/2017', '5/5/2017', '7/8/2017')
     , ('MX', 7008002892, 0, '5/11/2017', NULL, NULL, NULL, '7/8/2017')
     , ('MX', 7008002892, 20, '5/11/2017', '5/29/2017', NULL, NULL, '7/8/2017')
     , ('MX', 7008097791, 10, '7/4/2017', '7/4/2017', NULL, NULL, '7/8/2017')
     , ('MX', 7008097791, 20, '7/4/2017', '7/4/2017', '7/5/2017', NULL, '7/8/2017')
     , ('MX', 7008097849, 10, '7/4/2017', NULL, NULL, NULL, '7/8/2017');

SELECT O.Country
     , O.service_order
     , O.Line
     , O.Create_Date
     , O.Item_Creation_Date
     , O.Shipped_Date
     , O.Delivered_Date
     , O.Today
     , FirsNonNullDate = COALESCE(O.Delivered_Date, O.Shipped_Date, O.Item_Creation_Date, O.Create_Date)
     , DateDiffInDays  = DATEDIFF(DAY, COALESCE(O.Delivered_Date, O.Shipped_Date, O.Item_Creation_Date, O.Create_Date), Today)
FROM   #Orders AS O;

结果如下面的屏幕截图所示。希望对你有帮助。