Upotreba funkcije IndexCol

U servisu Oracle Analytics, naredbe CASE često se upotrebljavaju u slučaju grananja izračuna temeljem vrijednosti varijable. Ako je varijabla navedena u naredbi CASE, preporučujemo upotrebu funkcije IndexCol radi poboljšanja učinkovitosti generiranog SQL koda. U ovoj je temi opisana funkcija IndexCol i kada je upotrijebiti.

Više o funkciji IndexCol

Funkciju IndexCol upotrijebite ako stupci ili vrijednosti izračuna odstupaju u ovisnosti o vrijednosti sesije, repozitorija ili prezentacijske varijable.

Sintaksa funkcije IndexCol::

INDEXCOL(<<integer_literal>>, <<expr_list>>)

Gdje se prvi argument prebacuje u cjelobrojnu vrijednost, a stavke koje tvore <<expr_list>> odgovaraju broju mogućih vrijednosti prvog argumenta. Jedna od tih stavki zatim se upotrebljava u SQL naredbi temeljem vrijednosti prvog argumenta.

Npr., ako argument <<integer_literal>> ima tri moguće vrijednosti, u argumentu <<expr_list>> moraju postojati tri argumenta, po jedan za svaku moguću vrijednost <<integer_literal>>.

Prvi se argument često temelji na vrijednosti varijable sesije ili naredbe CASE u odnosu na varijable. Funkciju IndexCol možete modelirati u datoteci repozitorija (RPD) ili izravno u stupcu izvješća. Možete ugnijezditi više funkcija IndexCol kako biste oblikovali jednu naredbu.

Prednosti funkcije IndexCol

Izračun s pomoću naredbe <<case when>> u potpunosti se prosljeđuje u fizički SQL kôd. U odnosu na to, funkcija IndexCol se prosljeđuje prema dolje samo za traženi stupac ili izraz u bazi podataka. Razlog je u tome što se funkcija IndexCol procjenjuje prije generiranja fizičkog SQL koda.

U slučaju kombiniranja s odzivnicima varijabli, koji omogućavaju odabir na popisu vrijednosti, moći ćete u značajnoj mjeri izmijeniti strukturu izvješća, bez značajnog ugrožavanja brzine izvedbe.

Jedan nedostatak funkcije IndexCol je nemogućnost njezine upotrebe s naredbom like kod izračunavanja cijelih brojeva, premda like možete upotrebljavati u popisu izraza. Ako izračunavanje cijelih brojeva zahtijeva like, umjesto toga morate upotrijebiti naredbu CASE.

Primjer

Pretpostavimo kako postoji varijabla sesije naziva PREFERRED_CURRENCY koja postavlja željenu valutu za korisnika. Zatim će se temeljem vrijednosti varijable sesije prikazati prihod u valuti koju definira korisnik.

Dva izračuna stvorena su kako bi vratila odgovarajuću valutu temeljem vrijednosti varijable sesije.

Prvi upotrebljava naredbu CASE, ovako:

CASE

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'USD' THEN "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd" 

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'EUR' THEN  "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur" 

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'AUD' THEN  "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud" 

ELSE NULL

END

Drugi upotrebljava funkciju IndexCol, ovako:

INDEXCOL(

CASE VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY")

WHEN 'USD' THEN 0

WHEN 'EUR' THEN 1

WHEN 'AUD' THEN 2

END ,

"01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud")

Budući da se prvi argument funkcije IndexCol mora preobraziti u cjelobrojnu vrijednost, za razrješenje se upotrebljava naredba CASE.

Nakon pokretanja upita s pomoću izračuna naredbe CASE, čitava naredba CASE proslijedit će se prema dolje u bazi podataka, budući da se naredba CASE procjenjuje pri izvođenju. To u određenim slučajevima uzrokuje probleme s optimizatorom.

WITH

SAWITH0 AS (select sum(case  when 'USD' = 'USD' then T42437.Revenue_Usd when 'EUR' = 'USD' then T42437.Revenue_Eur when 'AUD' = 'USD' then T42437.Revenue_Aud else NULL end ) as c1,

     T42412.Office_Dsc as c2,

     T42412.Office_Key as c3

from

     BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ ,

     BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */

where  ( T42412.Office_Key = T42437.Office_Key )

group by T42412.Office_Dsc, T42412.Office_Key),

SAWITH1 AS (select 0 as c1,

     D1.c2 as c2,

     D1.c1 as c3,

     D1.c3 as c4

from

     SAWITH0 D1)

select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1,

     D1.c2 as c2,

     D1.c3 as c3

from

     SAWITH1 D1

order by c2 ) D1

The same query run using the IndexCol function pushes down only the expression needed to satisfy the query, because the IndexCol function is resolved prior to SQL generation.  This helps avoid issues with the Optimizer.

WITH

SAWITH0 AS (select sum(T42437.Revenue_Usd) as c1,

     T42412.Office_Dsc as c2,

     T42412.Office_Key as c3

from

     BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ ,

     BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */

where  ( T42412.Office_Key = T42437.Office_Key )

group by T42412.Office_Dsc, T42412.Office_Key),

SAWITH1 AS (select 0 as c1,

     D1.c2 as c2,

     D1.c1 as c3,

     D1.c3 as c4

from

     SAWITH0 D1)

select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1,

     D1.c2 as c2,

     D1.c3 as c3

from

     SAWITH1 D1

order by c2 ) D1

Radne knjige i IndexCol

Funkciju IndexCol možete upotrebljavati u radnim knjigama.

U tom primjeru, funkcija IndexCol služi za promjenu granularnosti razdoblja u vizualizaciji:

  1. Stvorite parametar koji će se upotrijebiti kao birač stupaca za odabir granularnosti razdoblja; u ovom slučaju, to je Mjesec ili Tromjesečje.

    Slijedi opis za GUID-1141C5E4-DB56-49D1-94EB-3010D274C477-default.jpg
    .jpg

  2. Stvorite prilagođeni izračun radi izvođenja funkcije IndexCol. Ovo je izračun:
    indexcol(case when @parameter("Time Selector Value")('Month')='Month' then 0 else 1 end, "HCM - Workforce Core"."Time"."Month Name", "HCM - Workforce Core"."Time"."Quarter")

    Slijedi opis za GUID-1EBB2C95-3D23-48C6-9754-EF968AFAFE98-default.jpg
    .jpg

  3. Dodajte parametar u traku filtara radne knjige. Korisnici zatim mogu promijeniti granularnost izvješća odabirom opcije Mjesec ili Tromjesečje iz filtra birača stupaca.

    Slijedi opis za GUID-C1469E54-1C7D-4FDF-B3E6-CCFE73BF2A32-default.jpg
    .jpg