Sql 如何将每行求和()到另一列中

Sql 如何将每行求和()到另一列中,sql,oracle,sum,cumulative-sum,Sql,Oracle,Sum,Cumulative Sum,我有这张桌子 | ID_prim | ID (FKey) | Date | Moved Items | |:-----------|:------------|-------------:|:------------:| | 1003 | 12_1 | nov 2013 | 2 | | 1003 | 12_2 | okt 2013 | 3 | |

我有这张桌子

 | 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         |
我想查询相同的表,如下所示:

按desc命令日期 对每行移动的每个项目求和 如果金额达到我想要的金额,停止查询 我想要的金额从最大“总计”26开始,减去我想要的金额16 像这样

| 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
我有以下几点

  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
但是这个总数并没有真正起作用。
有人能帮我为Oracle DB编写SQL语句以打印我想要的表吗?

根据OP通过对问题的评论所做的澄清,可以使用SUM分析函数获得运行总数,然后根据条件对其进行过滤

表:

运行总数

期望输出

请注意,2013年11月不是日期,而是字符串。由于要根据日期进行排序,因此必须始终使用to_date将其显式转换为日期。不管怎么说,我过去总是用日期来创建示例数据

Update OP希望在运行时从求和值的最大值中减去所需值

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>

在更新的查询中,MAXsm返回26,然后在sm>MAXsm-16的条件下过滤行,这意味着返回“sm”值大于26-16的所有行,即10。您可以使用替换变量在运行时输入值16。

2013年11月不是日期。请使用to_date为日期值提供一些示例数据。@LalitKumarB我没有写出上面的日期。在DB的“我的日期”列中,类似于2015-06-08 11:52:00,它是一个日期值。但这并不是这里的重点。主要关注的是总和以及如何迭代总和不是27而是26?@LalitKumarB不应该。请记住,我们首先进行计数,然后将所需值减去,以显示从最大值到最小值的结果,直到我们将所有行减去以获得所需值为止。也就是说。16+10=26,为什么不呢?如果不是,那么规则是什么?2,3,6,10,1,5的和是27而不是26。关闭,但我不想从0开始,然后从我的>=16开始计数并检查。我想先在“Running total”表中对它们进行计数,然后从最大值26中减去我想要的值16。如果在ID_PRIM ID DT MOVED SM---------------1003 12_9 02-FEB-15 10 36 1003 12_4 01-FEB-15 10 26上方添加另一行,会发生什么情况,那么我所需的输出也将显示最后的附加值。然后我想从MAX36开始,然后substract@Igoranze好的,看我的更新。在更新的查询中,MAXsm返回26,然后在sm>MAXsm-16的条件下过滤行,这意味着返回“sm”值大于26-16的所有行,即10。您可以使用替换变量在运行时输入值16。
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>
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>
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>