Excel公式转换为SQL

时间:2018-08-28 21:05:28

标签: sql-server

我有运行良好的SQL代码,我想向其中添加一个计算。现在,我已经用excel来计算日期之间的差,但是我希望看到它是通过SQL完成的。

.hero-image

谢谢!

3 个答案:

答案 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