提问人:Pugzly 提问时间:11/9/2023 更新时间:11/9/2023 访问量:55
数字总和列表
Sum list of numbers
问:
我有下面的代码,它生成一个数字列表及其工作。
我想生成 sum() 而不是数字列表。这种情况将是 1+2+3+4+5 = 15,其中 15 是我想要的唯一输出,但我似乎无法让它工作。任何帮助将不胜感激。
WITH t(n) AS (
SELECT 1 from dual UNION ALL
SELECT n+1 FROM t WHERE n < 5 )
SELECT * FROM t;
答:
1赞
Paul W
11/9/2023
#1
只需包裹:n
SUM
WITH t(n) AS (
SELECT 1 from dual UNION ALL
SELECT n+1 FROM t WHERE n < 5 )
SELECT SUM(n) FROM t;
但是,生成数字(如果需要,然后将它们相加)的更简单方法是:
select SUM(level) from dual connect by level <=5
1赞
charlieoscar
11/9/2023
#2
不能在 SQL 中使用 sum(*),但可以对 n 中的所有值求和:
WITH t(n) AS (SELECT 1 from dual UNION ALL
SELECT n+1 FROM t WHERE n < 5)
SELECT sum(n) FROM t;
我假设你已经知道了吗?
1赞
Littlefoot
11/9/2023
#3
您已经了解了如何计算这些数字的总和。
但是,为什么要创建一个数字列表,而您唯一感兴趣的是它们的总和?
一般来说,如果列表以 开头并以 结尾,则公式为 。重写为 Oracle SQL:1
n
n(n + 1) / 2
SQL> select &&par_number * (&&par_number + 1) / 2 as result from dual;
Enter value for par_number: 5
RESULT
----------
15
SQL> undefine par_number
SQL> select &&par_number * (&&par_number + 1) / 2 as result from dual;
Enter value for par_number: 3
RESULT
----------
6
SQL>
1赞
astentx
11/9/2023
#4
如果该列表的唯一目的是从 1 获取数字之和,则使用公式:。n
sum(1..n) = n*(n+1)/2
create function f_sum_1_n(n number)
return number
as
pragma udf;
begin
return n*(n+1)/2;
end;/
select f_sum_1_n(5)
from dual
F_SUM_1_N(5) |
---|
15 |
或者与 21c+ 的 SQL 宏相同,以避免上下文切换。
create function f_sum_1_n_macro(n number)
return varchar2
sql_macro(scalar)
as
begin
return q'[f_sum_1_n_macro.n*(f_sum_1_n_macro.n+1)/2]';
end;/
select sum(f_sum_1_n_macro(val))
from t
总和(F_SUM_1_N_MACRO(值)) |
---|
15 |
select *
from dbms_xplan.display_cursor(
format => '+PROJECTION'
)
PLAN_TABLE_OUTPUT
:-----------------
SQL_ID fv39qapvdaf6s, child number 1
-------------------------------------
select sum(f_sum_1_n_macro(val)) from t
Plan hash value: 2966233522
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
| 2 | TABLE ACCESS FULL| T | 1 | 3 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (#keys=0) SUM("VAL"*("VAL"+1)/2)[22]
2 - (rowset=256) "VAL"[NUMBER,22]
评论
select sum(n) from <subquery>