oracle 数字求和列表

db2dz4w8  于 7个月前  发布在  Oracle
关注(0)|答案(4)|浏览(50)

我有下面的代码,生成一个数字列表及其工作。
我想生成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;

字符串

px9o7tmv

px9o7tmv1#

你已经看到了如何计算这些数字的总和。
然而,为什么你要创建一个数字的列表,而你唯一感兴趣的是它们的
一般来说,如果 list1开头,以n结尾,则公式为n(n + 1) / 2。重写为Oracle SQL:

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>

字符串

7jmck4yq

7jmck4yq2#

只需将n Package 在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

snvhrwxg

snvhrwxg3#

在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;

字符串
我假设你已经知道这一点了。

6ioyuze2

6ioyuze24#

如果该列表的唯一目的是获得从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;/

个字符
| F_SUM_1_N(5)|
| --|
| 15 |
fiddle
或者使用SQL Macro for 21 c+来避免上下文切换。

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

的字符串
| SUM(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]

fiddle

相关问题