如何将每行SUM()转换为另一列

Igo*_*nze 10 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         |
Run Code Online (Sandbox Code Playgroud)

我想查询同一个表如下:

  1. 通过desc订购日期
  2. 每行对每个'Moved Item'求和
  3. 如果Sum达到我想要的数量,则停止查询
  4. 我想要的金额从MAX'Summed Total'开始(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
Run Code Online (Sandbox Code Playgroud)

当我达到"Summed Total"(26) - 16 = 10时,我想停止查询.所以从10开始向我显示所有内容>我只会在数据库中获取这些值.

| 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
Run Code Online (Sandbox Code Playgroud)

我所拥有的是以下内容

  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
Run Code Online (Sandbox Code Playgroud)

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

Lal*_*r B 3

根据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>
Run Code Online (Sandbox Code Playgroud)

运行总计

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>
Run Code Online (Sandbox Code Playgroud)

所需输出

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>
Run Code Online (Sandbox Code Playgroud)

请注意,nov 2013不是日期,而是字符串。由于您想根据日期进行排序,因此必须始终使用TO_DATE将其显式转换为date。无论如何,我使用 TO_DATE 创建示例数据。

Update 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>
Run Code Online (Sandbox Code Playgroud)

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