2017-11-19 21 views
1

は、私はこのようなテーブルを持っている:Oracleに計算された行を動的に追加するためにSQLを書き込む方法は?

id name value 
1 elec 10 
1 water 20 
2 elec 15 
2 water 45 

今、私は動的に選択クエリの結果にいくつかの行を追加する必要があります。

id name value 
1 elec 10 
1 water 20 
1 ratio 0.5 

2 elec 15 
2 water 45 
2 ratio 0.33  

は私がどのように行うことができ、動的に2つの行を追加しますか?ここで

+0

がトリガー –

+0

「コレクションを検索"は技術用語です。 「SELECTクエリの結果に行を追加する」という意味ですか?それは「コレクション」とは関係ありません。本当に「コレクション」を意味する場合は、「希望の結果」として表示するものがコレクションのように見えないため、説明してください。 – mathguy

+0

また、「グループの後にテーブルがあります」という意味はどうですか? Oracleは、ディスクに格納されているものに「表」という用語を使用します。あなたは(いくつかのクエリで)GROUP BYして、新しいテーブルのディスクに結果を保存しますか?そうであれば、比率を最初に計算して、1回のパスで可能な限り問題全体を解決してください。 – mathguy

答えて

2

IDごとに1行のELEC、WATER、およびRATIOカラムを使用して結果を「提示」することは、より意味があります。下のソリューションは、それを効率的に行う方法を示しています(ベーステーブルを1回だけ読み取る)。

with 
    inputs (id, name, value) as (
    select 1, 'elec' , 10 from dual union all 
    select 1, 'water', 20 from dual union all 
    select 2, 'elec' , 15 from dual union all 
    select 2, 'water', 45 from dual 
) 
-- End of simulated inputs (not part of the solution). 
-- SQL query begins BELOW THIS LINE. Use your actual table and column names. 
select id, elec, water, round(elec/water, 2) as ratio 
from inputs 
pivot (min(value) for name in ('elec' as elec, 'water' as water)) 
; 

     ID  ELEC  WATER  RATIO 
---------- ---------- ---------- ---------- 
     1   10   20   .5 
     2   15   45  .33 

あなたがあなたのオリジナルのポストに示したフォーマットの結果は、あなたがそう(まだ一度だけベーステーブルを読み込む)のようなアンピボットできる必要がある代わりに、場合:

with 
    inputs (id, name, value) as (
    select 1, 'elec' , 10 from dual union all 
    select 1, 'water', 20 from dual union all 
    select 2, 'elec' , 15 from dual union all 
    select 2, 'water', 45 from dual 
) 
-- End of simulated inputs (not part of the solution). 
-- SQL query begins BELOW THIS LINE. Use your actual table and column names. 
select id, name, value 
from (
    select id, elec, water, round(elec/water, 2) as ratio 
    from inputs 
    pivot (min(value) for name in ('elec' as elec, 'water' as water)) 
) 
unpivot (value for name in (elec as 'elec', water as 'water', ratio as 'ratio')) 
; 

     ID NAME  VALUE 
---------- ----- ---------- 
     1 elec   10 
     1 water   20 
     1 ratio   .5 
     2 elec   15 
     2 water   45 
     2 ratio  .33 
0

が一つの方法である:あなたが順序のわずかな変化を有する微細であれば

with t as (
     <your query here> 
    ) 
select id, name, value 
from ((select t.*, 1 as ord 
     from t 
    ) union all 
     (select id, 'ratio', 
       max(case when name = 'elec' then value end)/max(case when name = 'water' then value end) 
      ), 2 as ord 
     from t 
     group by id 
    ) 
    ) tt 
order by id, ord; 
0

、これを試してみてください。

SELECT id,name,value FROM yourtable 
UNION ALL 
SELECT 
       a.id , 
       'ratio' name, 
       a.value/b.value value 
     FROM 
       yourtable a 
     JOIN yourtable b on a.id = b.id 
     WHERE a.name = 'elec' 
       and b.name = 'water' 
ORDER BY 
     id , 
     VALUE DESC; 

テーブル自体に行を追加する必要がある場合は、を使用します。

INSERT INTO yourtable 
SELECT 
     a.id , 
     'ratio' name, 
     a.value/b.value value 
FROM 
     yourtable a 
JOIN yourtable b on a.id = b.id 
WHERE a.name  ='elec' 
     and b.name ='water'; 
関連する問題