首页 > 解决方案 > 从上一行获取价值

问题描述

我正在尝试从前一行获取值,然后将其添加到当前行中的值以用于报告目的。

报告的目的是查看当天下午 5 点前下单并在晚上 10 点前发货的订单总数,下午 5 点后下单的订单需要添加到第二天,还有任何不符合前一天的订单晚上 10 点之前的 5 点标准也被添加到第二天的总数中。

SELECT SUB1."DATE",
  COUNT(SUB1."ORDER_ID")                   AS "TOTAL",
  SUM(SUB1."SAME_DAY")                     AS "SAME_DAY",
  (COUNT(SUB1."ORDER_ID") - SUM(SUB1.SAME_DAY)) AS "CARRIED_FORWARD",
  SUM(SUB1."AFTER_5"),
  SUM(SUB1."AFTER_5_CF"),
  SUM(SUB1."SAME_DAY1_CF")
FROM
  (SELECT TO_CHAR(ORDER_DATE, 'DD/MM/YYYY') AS "DATE",
    ORDER_ID,
    CASE
      WHEN TO_CHAR(ORDER_DATE, 'DD/MM/YYYY') = TO_CHAR(SHIPPED_DATE,'DD/MM/YYYY')
      AND TO_CHAR(ORDER_DATE, 'HH24')        < 17
      AND TO_CHAR(SHIPPED_DATE, 'HH24')      < 22
      THEN 1
      ELSE 0
    END AS "SAME_DAY",
    CASE
      WHEN TO_CHAR(ORDER_DATE, 'HH24') >= 17
      THEN 1
      ELSE 0
    END AS "AFTER_5",
    CASE
      WHEN TO_CHAR(ORDER_DATE , 'DD-MM-YYYY') = TO_CHAR(SHIPPED_DATE - 1, 'DD-MM-YYYY')
      AND TO_CHAR(ORDER_DATE , 'HH24')        >= 17
      AND TO_CHAR(SHIPPED_DATE, 'HH24')       < 22
      THEN 1
      ELSE 0
    END AS "AFTER_5_CF",
    CASE
      WHEN TO_CHAR(ORDER_DATE , 'DD-MM-YYYY') = TO_CHAR(SHIPPED_DATE - 1, 'DD-MM-YYYY')
      AND TO_CHAR(ORDER_DATE , 'HH24')        < 17
      AND TO_CHAR(SHIPPED_DATE, 'HH24')       < 22
      THEN 1
      ELSE 0
    END AS "SAME_DAY1_CF"
  FROM ORDER_HEADER
  WHERE ORDER_DATE BETWEEN TO_TIMESTAMP('2019-11-07', 'YYYY-MM-DD') AND TO_TIMESTAMP('2019-11-13', 'YYYY-MM-DD')
  )SUB1
GROUP BY SUB1."DATE"

上面的代码给了我我需要的一切,但总数应该是(总计 + 结转 + 5 之后)和“同一天”应该是(同一天 + 5 CF 之后 + 同一天 1 CF)

我已经尝试使用 LAG 给它上一个日期,但我不确定我是否正确使用它,如果没有办法做到这一点并在一行上显示信息,那很好。

如果我能完成这项工作,那么我应该能够处理周五、周六和周日,因为他们的结转需要添加到下周一。

标签: plsql

解决方案


听起来您需要一个窗口子句来动态回顾一定数量的行。语法大致如下:

SUM(some_col) over ( order by col range between nn preceding and nn following)

这让当前行根据某个范围的大小“向后看”或向前看(例如向后看 3 天,向前看 1 天等)。在您的情况下,您希望根据当前数据动态更改该金额,即大多数日子我们回顾一天,但对于星期一,我们也希望回顾周末。

您可以通过在 window 子句中控制它的函数调用来实现这一点。巧合的是,作为窗口函数 SQL 系列的一部分,我做了一个完全涵盖该场景的教程。你可以在这里演示

https://www.youtube.com/watch?v=Y40v2Rwqs4Q&list=PLJMaoEWvHwFIUwMrF4HLnRksF0H8DHGtt&index=16


推荐阅读