我有运行良好的SQL代码,我想向其中添加一个计算。现在,我已经用excel来计算日期之间的差,但是我希望看到它是通过SQL完成的。
.hero-image
谢谢!
答案 0 :(得分:3)
我相信这样可以解决问题:
CASE WHEN Shipped_Date <= COALESCE(CUST_ORDER_LINE.PROMISE_DATE, CUSTOMER_ORDER.PROMISE_DATE) Then 'On-Time' Else 'Late' END
COALESCE()
返回它在参数列表中遇到的第一个非null值。因此,如果CUST_ORDER_LINE.Promise_Date
为空,则它将返回Customer_Order.Promise_Date
。
我们只是将两个日期相互比较,而不是减去它们并寻找负数。
CASE
语句将替换您的If()
逻辑。语法非常简单,因此如果您打算做更多这项工作,绝对值得学习。
答案 1 :(得分:2)
您可以尝试以下操作:
CASE
WHEN Shipped_Date <= COALESCE(CUST_ORDER_LINE.PROMISE_DATE, CUSTOMER_ORDER.PROMISE_DATE)
THEN "On-Time"
ELSE "Late"
END
答案 2 :(得分:2)
不是真的回答,因为您已经有两个。但这对于评论来说太长了。您应该避免在表名和列名周围使用双引号。别名很棒,但是只要再次使用表名,别名便会达到目的。 :)使用较短的别名,这面文字墙在您眼中变得非常容易。这是一个例子。
SELECT
c.NAME
, c.USER_1
, c.ID
, ol.CUST_ORDER_ID
, ol.MISC_REFERENCE
, ol.PART_ID
, ol.PROMISE_DATE -- 1
, ol.UNIT_PRICE
, co.CUSTOMER_ID
, co.PROMISE_DATE -- 2
, co.ID
, s.SHIPPED_DATE -- 3
, sl.CUST_ORDER_LINE_NO
, sl.PACKLIST_ID
, sl.USER_SHIPPED_QTY
--, THE FOLLOWING FORMULA NEEDS TO GO HERE
--=IF(IF([@[PROMISE_DATE]]=,[@[SHIPPED_DATE]]-[@[PROMISE_DATE2]],
--[@[SHIPPED_DATE]]-[@[PROMISE_DATE]])<=0,On-Time,Late)
, CAST((sl.USER_SHIPPED_QTY * ol.UNIT_PRICE) AS decimal(15, 2)) AS Total_Dollars_Shipped
FROM ATL.dbo.CUST_ORDER_LINE ol
INNER JOIN ATL.dbo.SHIPPER_LINE sl ON ol.CUST_ORDER_ID = sl.CUST_ORDER_ID
AND ol.LINE_NO = sl.CUST_ORDER_LINE_NO
INNER JOIN ATL.dbo.SHIPPER s ON sl.PACKLIST_ID = s.PACKLIST_ID
INNER JOIN ATL.dbo.CUSTOMER_ORDER co ON s.CUST_ORDER_ID = co.ID
INNER JOIN ATL.dbo.CUSTOMER c ON co.CUSTOMER_ID = c.ID
WHERE s.SHIPPED_DATE>={ts '2015-01-01 00:00:00'}
AND sl.USER_SHIPPED_QTY <> 0
AND ol.UNIT_PRICE <> 0.00
ORDER BY s.SHIPPED_DATE, co.CUSTOMER_ID