簡體   English   中英

如何編寫一個SQL動態地在Oracle中添加一些計算的行?

[英]How to write a sql to dynamically add some calculated rows in Oracle?

我有一張這樣的桌子:

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    

動態添加兩行,我該怎么辦?

使用ELEC,WATER和RATIO列“呈現”結果(每個ID一行一行)會更有意義。 下面的解決方案顯示了如何有效地執行此操作(僅讀取基表一次)。

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

這是一種方法:

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;

如果您對順序稍有更改沒問題,請嘗試此操作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM