Найти факториал в Oracle - PullRequest
1 голос
/ 18 ноября 2011

У меня есть таблица, в которой есть номера вызовов столбцов

Numbers
------
3
5

Я пытаюсь получить их факториал.Я использую приведенную ниже логику, но не с правильным результатом

Select 
    Numbers
    ,EXP(SUM(LN(Numbers)) OVER (ORDER BY Numbers)) Factorial 
FROM testTbl

* Вывод *

Numbers Factorial
------  ---------
3   3.00000000000000000000000000000000000001
5   15.0000000000000000000000000000000000002

Что не так?Пожалуйста, помогите

Expected
--------

Numbers Factorial
------  ---------
3   6
5   120

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Я попробовал сделать это с другой стороны, пытаясь сделать все это в SQL-выражении (используя вашу таблицу testTbl и номера столбцов).

Это то, что я придумал, посмотрите, подходит ли вам это:

  SELECT testtbl.numbers,
         ROUND( EXP( SUM( LN( t1.n ) ) ) ) AS factorial
    FROM (    SELECT UNIQUE LEVEL n
                FROM testtbl
          CONNECT BY LEVEL <= numbers) t1,
         (    SELECT UNIQUE LEVEL n
                FROM testtbl
          CONNECT BY LEVEL <= numbers) t2,
         testTbl
   WHERE t1.n <= t2.n
     AND t2.n = testTbl.numbers
   GROUP BY testtbl.numbers
   ORDER BY testtbl.numbers;

Дает вывод:

Numbers Factorial
3       6  
5       120

Надеюсь, это поможет ...

2 голосов
/ 18 ноября 2011

Будь это я, я бы создал факториальную функцию и вызвал бы эту пользовательскую функцию в своем запросе. Что-то вроде

SQL> create function factorial( p_n in number )
  2    return number
  3  is
  4  begin
  5    if( p_n = 1 )
  6    then
  7      return p_n;
  8    else
  9      return p_n * factorial( p_n - 1 );
 10    end if;
 11  end;
 12  /

Function created.

SQL> with t as (
  2    select 3 num from dual
  3    union all
  4    select 5 from dual
  5  )
  6  select num,
  7         factorial(num)
  8    from t;

       NUM FACTORIAL(NUM)
---------- --------------
         3              6
         5            120

Если по какой-то причине вы не можете определить новую функцию и действительно хотите сделать это в SQL, вы можете сгенерировать все числа, меньшие числа в вашей таблице, а затем агрегировать эти сгенерированные числа.

SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2    select 3 num from dual
  3    union all
  4    select 5 from dual
  5  )
  6  select t.num,
  7         exp( sum(ln(gen.num))) factorial
  8    from (select level num
  9            from dual
 10         connect by level <= (select max(t.num) from t)) gen,
 11         t
 12   where gen.num <= t.num
 13*  group by t.num
SQL> /

       NUM  FACTORIAL
---------- ----------
         5        120
         3          6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...