Oracle
 sql >> база данни >  >> RDS >> Oracle

Как най-добре да се изчислят агрегирани данни на n-ниво въз основа на (n-1) данни на ниво (Oracle)

Благодарение на MODEL функция за синтаксис подсказка от GregV във форума на Oracle Бих могъл да напиша тази заявка наистина много кратко и точно, без да има нужда от порно . Страхотно!

За да проверя лесно разликата с моя примерен код и поне 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01843:невалиден месец при вмъкване на дата в Oracle

  2. OracleConnection хвърля празно изключение

  3. Импортиране от валидираща проверка на базата данни на Oracle

  4. Как мога да поставя IF ELSE CONDITION в заявката на Oracle?

  5. Материализираният изглед в oracle с Fast Refresh вместо пълен не работи