从上一行获取价值

时间:2019-11-13 12:20:02

标签: plsql jaspersoft-studio

我试图从上一行中获取值,然后将其添加到当前行中的值中以进行报告。

该报告的目的是查看每天下午5点之前完成并在晚上10点之前发货的订单总数, 在下午5点之后订购的所有订单都需要添加到第二天,但是在晚上10点之前的5PM之前不符合标准的所有订单也要添加到第二天的总数中。

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 Day CF)

我尝试过使用LAG为其提供上一个日期,但是我不确定我是否正确使用了它,如果没有办法在一行上显示信息,那就是很好。

如果我可以进行这项工作,那么我应该能够处理星期五,星期六和星期日,因为它们的结转额需要添加到之后的星期一。

1 个答案:

答案 0 :(得分:1)

听起来您需要一个window子句来动态地回溯一定数量的行。语法如下:

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