2014-02-21 3 views
-2

В this ответе (со всей исполняемой упрощенным и документированным образцом кодой + полезными комментариями)Как лучше рассчитать данные объединения п уровня на основе (п-1) -уровни данных (Oracle)

Я сделал вид трюк там, чтобы вычислить две последние строки следующей таблицы:

DESCR        SUM  
---------------------------------- ---------- 
money available in 2013   33233235.3 
money spent in 2013     4253235.3 
money bound to contracts in 2013  34333500 
money spent 2013 in % of available   12 
money bound 2013 in % of available  103 

кто-нибудь знает лучше (производительность, объем кода, понятность) способ сделать такого рода операции?

(чем использовать прикладную "обеспечивают unioned нулевой строки, залить случае и продукт() - более() на N +-агрегацию уровня -trick", назовем его punurofiwicapoonalt -trick (naah ... все еще сложно) ... звучит так: да, назовем это porno -trick; O) (... okay ... alias capoon -trick если вам это не нравится))

+1

гораздо больше подходит для http://dba.stackexchange.com –

ответ

0

Благодаря функции синтаксиса MODELhint from GregV in the Oracle forum Я мог бы напишите этот запрос действительно очень короткий и точный без необходимости porno. Круто!

Так легко проверить разницу с моим образцом кода и по крайней мере 10g Oracle DB вам просто нужно изменить исходный сценарий, связанный выше следующим образом:

 /************************** 
     * the original sample query base data 
     ***************************/ 
     ... -- all content before the last select of the original example-SQL 

     /************************** 
     * the original sample porno-query 
     ***************************/ 

     ,agg_porno as (
      select 
       descr, 

       ... -- all the porno-query details 

      from sum_data_lvl1 
      /* 
      DESCR        SUM  AGG_LVL SUM_ID 
      ---------------------------------- ---------- ------- ------ 
      money available in 2013   33233235.3  1 MA 
      money spent in 2013     4253235.3  1 MS 
      money bound to contracts in 2013  34333500  1 MB 
      money spent 2013 in % of available   12  2 MSP 
      money bound 2013 in % of available  103  2 MBP 
      */ 
     ) 

     /************************** 
     * the new nice model-based query instead 
     ***************************/ 

     ,agg_model as (
      select 
       descr, 
       trunc(s,1) as sum, 
       agg_lvl, 
       sum_id 
      from sum_data_lvl1 
      model 
       dimension by (sum_id) 
       measures (descr, sum as s, agg_lvl) 
       rules (
        s['MSP'] = s['MS']/s['MA'] * 100, 
        s['MBP'] = s['MB']/s['MA'] * 100 
       ) 
     ) 
     /* 
     DESCR        SUM  AGG_LVL SUM_ID 
     ---------------------------------- ---------- ------- ------ 
     money available in 2013   33233235.3  1 MA 
     money spent in 2013     4253235.3  1 MS 
     money bound to contracts in 2013  34333500  1 MB 
     money spent 2013 in % of available  12.7  2 MSP 
     money bound 2013 in % of available  103.3  2 MBP 
     */ 

select * from agg_porno where 1=0 -- change to 1=1 to see these results 
union all select * from agg_model where 1=1 -- change to 1=0 to hide these results