Расчет Oracle с использованием результатов другого расчета - PullRequest
3 голосов
/ 03 июня 2009

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

Вот что работает:

SELECT cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per
FROM my_table
ORDER BY cost DESC

Вот что я пытаюсь сделать, это не работает:

SELECT cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per,
       SUM(cost/SUM(cost) OVER()) OVER(cost) AS per_sum
FROM my_table
ORDER BY cost DESC

Я просто ошибаюсь, или то, что я пытаюсь сделать, просто невозможно? Кстати я использую Oracle 10g. Заранее спасибо за любую помощь.

Ответы [ 2 ]

6 голосов
/ 04 июня 2009

Вам не нужен порядок внутри этого встроенного представления, тем более что внешний выбор выполняет порядок в порядке, обратном порядку. Кроме того, стоимость / SUM (стоимость) OVER () равна RATIO_TO_REPORT (стоимость) OVER ().

Пример:

SQL> create table my_table(cost)
  2  as
  3  select 10 from dual union all
  4  select 20 from dual union all
  5  select 5 from dual union all
  6  select 50 from dual union all
  7  select 60 from dual union all
  8  select 40 from dual union all
  9  select 15 from dual
 10  /

Table created.

Ваш начальный запрос:

SQL> SELECT cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per
  2  FROM my_table
  3  ORDER BY cost DESC
  4  /

      COST      TOTAL        PER
---------- ---------- ----------
        60        200         .3
        50        200        .25
        40        200         .2
        20        200         .1
        15        200       .075
        10        200        .05
         5        200       .025

7 rows selected.

Запрос Quassnoi содержит опечатку:

SQL> SELECT  cost, total, per, SUM(running) OVER (ORDER BY cost)
  2  FROM    (
  3          SELECT  cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per
  4          FROM    my_table
  5          ORDER BY
  6                  cost DESC
  7          )
  8  /
SELECT  cost, total, per, SUM(running) OVER (ORDER BY cost)
                              *
ERROR at line 1:
ORA-00904: "RUNNING": invalid identifier

И если я исправлю эту опечатку. Это дает правильные результаты, но неправильно отсортировано (наверное):

SQL> SELECT  cost, total, per, SUM(per) OVER (ORDER BY cost)
  2  FROM    (
  3          SELECT  cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per
  4          FROM    my_table
  5          ORDER BY
  6                  cost DESC
  7          )
  8  /

      COST      TOTAL        PER SUM(PER)OVER(ORDERBYCOST)
---------- ---------- ---------- -------------------------
         5        200       .025                      .025
        10        200        .05                      .075
        15        200       .075                       .15
        20        200         .1                       .25
        40        200         .2                       .45
        50        200        .25                        .7
        60        200         .3                         1

7 rows selected.

Я думаю, это то, что вы ищете:

SQL> select cost
  2       , total
  3       , per
  4       , sum(per) over (order by cost desc)
  5    from ( select cost
  6                , sum(cost) over () total
  7                , ratio_to_report(cost) over () per
  8             from my_table
  9         )
 10   order by cost desc
 11  /

      COST      TOTAL        PER SUM(PER)OVER(ORDERBYCOSTDESC)
---------- ---------- ---------- -----------------------------
        60        200         .3                            .3
        50        200        .25                           .55
        40        200         .2                           .75
        20        200         .1                           .85
        15        200       .075                          .925
        10        200        .05                          .975
         5        200       .025                             1

7 rows selected.

С уважением, Роб.

2 голосов
/ 03 июня 2009
SELECT  cost, total, per, SUM(per) OVER (ORDER BY cost)
FROM    (
        SELECT  cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per
        FROM    my_table
        )
ORDER BY
        cost DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...