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>