数字总和列表

Sum list of numbers

提问人:Pugzly 提问时间:11/9/2023 更新时间:11/9/2023 访问量:55

问:

我有下面的代码,它生成一个数字列表及其工作。

我想生成 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;

甲骨文 总和

评论

0赞 astentx 11/9/2023
怎么了?select sum(n) from <subquery>

答:

1赞 Paul W 11/9/2023 #1

只需包裹:nSUM

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:1nn(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 获取数字之和,则使用公式:。nsum(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]

小提琴