如何将每一行SUM()分成另一列

时间:2015-06-08 09:45:20

标签: sql oracle sum running-total

我有这张桌子

 | ID_prim    | ID (FKey)   | Date         | Moved Items  |
 |:-----------|:------------|-------------:|:------------:|
 | 1003       | 12_1        |    nov 2013  |    2         |
 | 1003       | 12_2        |    okt 2013  |    3         |
 | 1003       | 12_3        |    dec 2014  |    5         |
 | 1003       | 12_4        |    feb 2015  |    10        |
 | 1003       | 12_5        |    apr 2012  |    1         |
 | 1003       | 12_11       |    jan 2011  |    5         |

我想查询同一个表,如下所示:

  1. 通过desc订购日期
  2. 每行汇总每个“已移动的项目”
  3. 如果Sum达到我想要的金额,则停止查询
  4. 我想要的金额从MAX'Summed Total'开始(26)并减去我想要的金额(16)
  5. 喜欢这样

    | ID_prim    | ID (FKey)   | Date         | Moved Items  | Summed Total |
    |:-----------|:------------|-------------:|:------------:|:------------:|
    | 1003       | 12_4        |    feb 2015  |     10       |     26
    | 1003       | 12_3        |    dec 2014  |     5        |     16
    | 1003       | 12_3        |    nov 2013  |     2        |     11 <
    | 1003       | 12_4        |    okt 2013  |     3        |     9 
    | 1003       | 12_5        |    apr 2012  |     1        |     6
    | 1003       | 12_11       |    jan 2011  |     5        |     5
    

    当我达到“Summed Total”(26) - 16 = 10时,我想停止查询。所以从10&gt;给我看一切 我只会在数据库中获取这些值。

    | ID_prim    | ID (FKey)   | Date         | Moved Items  | Summed Total |
    |:-----------|:------------|-------------:|:------------:|:------------:|
    | 1003       | 12_4        |    feb 2015  |     10       |     26
    | 1003       | 12_3        |    dec 2014  |     5        |     16
    | 1003       | 12_3        |    nov 2013  |     2        |     11
    

    我所拥有的是以下

      SELECT
      T1.ID_prim, T1.ID as ID (FKey), T1.Moved_Items as Moved Items, t1.Date, SUM(T2.MOVEMENTQTY) AS Summed Total
      FROM Table1 T1
      INNER JOIN Table1 T2 ON T2.ID <= T1.ID
        inner join table2 inout on T1.ID_prim = inout.ID_prim
        AND T2.ID_prim = inout.ID_prim
        AND T2.ID_prim = T1.ID_prim
      where t1.ID_prim = 1003
      and t2.ID_prim = 1003
      and inout.ISSOTRX = 'N'
      GROUP BY T1.ID_prim, T1.Moved Items, t1.Date
      HAVING SUM(T2.Moved Items) <= 16
      order by  t1.UPDATED desc
    

    但总和并没有真正起作用。 任何人都可以帮我制作将打印我的Desired表的Oracle DB的SQL语句吗?

1 个答案:

答案 0 :(得分:4)

根据OP对该问题的评论进行澄清,可以使用 SUM()分析函数来获取运行总计,然后过滤它基于条件。

表格

SQL> SELECT * FROM t;

   ID_PRIM ID    DT             MOVED
---------- ----- --------- ----------
      1003 12_1  01-NOV-13          2
      1003 12_2  01-OCT-13          3
      1003 12_3  01-DEC-14          5
      1003 12_4  01-FEB-15         10
      1003 12_5  01-APR-12          1
      1003 12_11 01-JAN-11          5

6 rows selected.

SQL>

累计

SQL> SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC;

   ID_PRIM ID    DT             MOVED         SM
---------- ----- --------- ---------- ----------
      1003 12_4  01-FEB-15         10         26
      1003 12_3  01-DEC-14          5         16
      1003 12_1  01-NOV-13          2         11
      1003 12_2  01-OCT-13          3          9
      1003 12_5  01-APR-12          1          6
      1003 12_11 01-JAN-11          5          5

6 rows selected.

SQL>

所需的输出

SQL> WITH DATA AS
  2    ( SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC
  3    )
  4  SELECT * FROM data WHERE sm >= 16;

   ID_PRIM ID    DT             MOVED         SM
---------- ----- --------- ---------- ----------
      1003 12_4  01-FEB-15         10         26
      1003 12_3  01-DEC-14          5         16

SQL>

请注意,nov 2013不是日期,而是字符串。由于您希望按日期排序,因此必须始终使用 TO_DATE 将其明确转换为日期。无论如何,我使用TO_DATE来创建样本数据。

更新 OP希望在运行时从总计值的 MAX 值中减去所需的值。

SQL> WITH DATA AS
  2    ( SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC
  3    )
  4  SELECT * FROM DATA t WHERE sm >
  5    (SELECT MAX(sm) FROM data
  6    ) - 16 ;

   ID_PRIM ID    DT             MOVED         SM
---------- ----- --------- ---------- ----------
      1003 12_4  01-FEB-15         10         26
      1003 12_3  01-DEC-14          5         16
      1003 12_1  01-NOV-13          2         11

SQL>

在更新的查询中, MAX(sm)返回26,然后在条件WHERE sm > MAX(sm) -16上过滤行,这意味着返回&#所在的所有行39; SM&#39;值大于26 -16,即10。您可以使用替换变量在运行时输入值16