Bruge funktionen IndexCol

I Oracle Analytics bruges CASE-sætninger ofte, når en beregning forgrenes på basis af en variabel værdi. Når der refereres til en variabel i en CASE-sætning, er det bedst i stedet at bruge funktionen IndexCol for at forbedre den genererede SQL-kodes effektivitet. Dette emne beskriver funktionen IndexCol, og hvornår den skal bruges.

Om funktionen IndexCol

Du bruger funktionen IndexCol, når kolonnerne eller værdierne i en beregning varierer alt efter værdien for en sessions-, informationsbase- eller præsentationsvariabel.

Syntaksen for funktionen IndexCol er:

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

Hvor det første argument fortolkes til et heltal, og de elementer, der udgør <<expr_list>>, svarer til antallet af mulige værdier for det første argument. Et af disse elementer bruges derefter i SQL-sætningen på basis af værdien af det første argument.

Hvis argumentet <<integer_literal>> for eksempel har tre mulige værdier, skal der være tre argumenter i argumentet <<expr_list>>, ét for hver mulig værdi for <<integer_literal>>.

Det første argument er ofte baseret på værdien af en sessionsvariabel eller en CASE-sætning med reference til variabler. Du kan modellere funktionen IndexCol i informationsbasefilen (RPD) eller direkte i en rapportkolonne. Du kan indlejre flere IndexCol-funktioner for at danne en enkelt sætning.

Fordele ved funktionen IndexCol

En beregning, der anvender en <<case when>> -sætning, skubbes til den fysiske SQL-kode i sin helhed. Funktionen IndexCol skubber derimod kun den påkrævede kolonne eller det påkrævede udtryk ned til databasen. Det skyldes, at funktionen IndexCol evalueres, før den fysiske SQL-kode genereres.

Du kan modificere rapportstrukturen betydeligt, uden at det går ud over ydeevnen, når den kombineres med variabelprompter, hvilket giver mulighed for valg på en værdiliste.

Én ulempe ved funktionen IndexCol er, at du ikke kan bruge den sammen med like i heltalsberegninger, selvom du kan bruge like på listen over udtryk. Hvis en heltalsberegning kræver et like, skal du bruge en CASE-sætning i stedet.

Eksempel

Antag, at der er en sessionsvariabel med navnet PREFERRED_CURRENCY, der angiver en brugers foretrukne valuta. Indtægt vises derefter i den valuta, der er angivet af brugeren, på basis af værdien af sessionsvariablen.

Der er oprettet to beregninger, som returnerer den korrekte valuta på basis af værdien af sessionsvariablen.

Den første bruger en CASE-sætning som vist nedenfor:

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

Den anden bruger funktionen IndexCol som vist nedenfor:

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")

Da det første argument for funktionen IndexCol skal fortolkes til et heltal, bruges der en CASE-sætning til fortolkningen.

Når en forespørgsel køres ved hjælp af en beregning af CASE-sætningen, skubbes CASE-sætningen i sin helhed ned til databasen, da CASE-sætningen evalueres ved runtime. I nogle tilfælde skaber dette problemer med optimizer.

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

Projektmapper og IndexCol

Du kan bruge funktionen IndexCol i projektmapper.

I dette eksempel bruges funktionen IndexCol til at ændre periodedetaljeringsniveauet i en visualisering:

  1. Opret en parameter, der skal bruges som kolonnevælger til valg af periodedetaljegraden, i dette tilfælde enten Month eller Quarter.

    Beskrivelse af GUID-1141C5E4-DB56-49D1-94EB-3010D274C477-default.jpg følger
    .jpg

  2. Opret en tilpasset beregning for at udføre funktionen IndexCol. Her er beregningen:
    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")

    Beskrivelse af GUID-1EBB2C95-3D23-48C6-9754-EF968AFAFE98-default.jpg følger
    .jpg

  3. Føj parameteren til filterlinjen i en projektmappe. Brugere kan derefter ændre en rapports detaljeringsgrad ved at vælge enten Month eller Quarter fra kolonnevælgerfilteret.

    Beskrivelse af GUID-C1469E54-1C7D-4FDF-B3E6-CCFE73BF2A32-default.jpg følger
    .jpg