2009-06-03 11 views
3

まず、SQLに精通していますが、私はOracleの全面的な知識です。私は単一のコストの列を持っています。私は総コスト、総コストのパーセンテージ、そしてパーセンテージの合計を計算する必要があります。私はこれを行うと考えることができる唯一の方法はネストされたSUM関数を使用するので、実行中のパーセンテージの合計に問題があります。これは許されません。別の計算の結果を含むOracleの計算

はここでどのような作品だ。ここでは

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を使用しています。助けを前にありがとう。

+0

QuassnoiとRob van Wijkは正しいアプローチをしており、インラインビューを使用しています。 – spencer7593

答えて

2
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 
+0

ありがとう、私は明らかに考えていませんでした... – Dave

6

特にインナービューで注文する必要はありません。特に、アウターセレクトがオーダー方法で注文しているためです。また、コスト/ 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 
    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. 

よろしく、 ロブ:

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. 

私は、これはあなたが探している1だと思います。

+0

@Rob:誤植に気付き、ORDER BYで問題を起こしていただきありがとうございます。また、RATIO_TO_REPORTの良い点もあります。 +1 – Quassnoi