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;
结果如下面的屏幕截图所示。希望对你有帮助。
我真的需要你的帮助来解决以下问题。我有以下查询:
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;
结果如下面的屏幕截图所示。希望对你有帮助。