【问题标题】:How can I add column values till a certain value is reached (using select query)如何添加列值直到达到某个值(使用选择查询)
【发布时间】:2019-07-26 10:44:27
【问题描述】:

我有一张如下表:

Date                Bill No     Amount   
24/07/19 12:00:00   43565        20
24/07/19 18:00:00   12354        100
22/07/19 13:20:02   12782        120
22/07/19 15:30:23   99807        200
21/07/19 20:00:23   23686        50
21/07/19 11:34:45   38965        10
21/07/19 10:05:30   04578        45
20/07/19 19:30:00   34950        38
20/07/19 14:25:00   54954        25

从 sysdate 开始,我想总结金额(回溯日期),直到总和达到 500 或接近 500。

当总和达到500时,我还想记录它达到该值的日期和时间。

我试过循环遍历数据,但是表中的记录数量很大,而且需要很多时间。

有没有办法使用选择查询来实现这一点。

例如。从 2019 年 7 月 24 日开始,我将继续添加金额 -> 20+100+120+200+50+10

总数为 500,2019 年 7 月 21 日 11:34:45 达到 500

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    使用SUM( Amount ) OVER ( ORDER BY "DATE" DESC ) 分析函数获取累计总数,然后您只需过滤累计总数小于 500 的行并找到最大的行:

    Oracle 设置

    CREATE TABLE table_name ( "DATE", Bill_No, Amount ) AS
    SELECT DATE '2019-07-24' + INTERVAL '12:00:00' HOUR TO SECOND, '43565',  20 FROM DUAL UNION ALL
    SELECT DATE '2019-07-24' + INTERVAL '18:00:00' HOUR TO SECOND, '12354', 100 FROM DUAL UNION ALL
    SELECT DATE '2019-07-22' + INTERVAL '13:20:02' HOUR TO SECOND, '12782', 120 FROM DUAL UNION ALL
    SELECT DATE '2019-07-22' + INTERVAL '15:30:23' HOUR TO SECOND, '99807', 200 FROM DUAL UNION ALL
    SELECT DATE '2019-07-21' + INTERVAL '20:00:23' HOUR TO SECOND, '23686',  50 FROM DUAL UNION ALL
    SELECT DATE '2019-07-21' + INTERVAL '11:34:45' HOUR TO SECOND, '38965',  10 FROM DUAL UNION ALL
    SELECT DATE '2019-07-21' + INTERVAL '10:05:30' HOUR TO SECOND, '04578',  45 FROM DUAL UNION ALL
    SELECT DATE '2019-07-20' + INTERVAL '19:30:00' HOUR TO SECOND, '34950',  38 FROM DUAL UNION ALL
    SELECT DATE '2019-07-20' + INTERVAL '14:25:00' HOUR TO SECOND, '54954',  25 FROM DUAL
    

    查询

    SELECT *
    FROM   (
      SELECT *
      FROM   (
        SELECT t.*,
               SUM( Amount ) OVER ( ORDER BY "DATE" DESC ) AS total
        FROM   table_name t
      )
      WHERE total <= 500
      OR    ROWNUM = 1   -- Make sure at least one row is returned.
      ORDER BY total DESC
    )
    WHERE ROWNUM = 1
    

    输出

    日期 | BILL_NO |数量 |全部的 :----------------- | :-------- | -----: | ----: 2019-07-21 11:34:45 | 38965 | 10 | 500

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2019-10-03
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多