Jaa


DAX-kaavojen parantaminen muuttujien avulla

Tietojen mallintajana joidenkin DAX-laskutoimitusten kirjoittaminen ja virheenkorjaus voi olla haastavaa. On yleistä, että monitasoisiin laskentavaatimuksiin liittyy usein yhdistelmä- tai monitasoisten lausekkeiden kirjoittamista. Yhdistelmälausekkeisiin voi sisältyä useiden sisäkkäisten funktioiden käyttö ja mahdollisesti lausekelogiikan uudelleenkäyttö.

DAX-kaavojen muuttujien avulla voit kirjoittaa monimutkaisempia ja tehokkaampia laskutoimituksia. Muuttujat voivat parantaa suorituskykyä, luotettavuutta, luettavuutta ja vähentää monimutkaisuutta.

Tässä artikkelissa esitellään kolme ensimmäistä käyttämällä esimerkkinä vuoden aikana (YoY) myynnin kasvua. (YoY-myynnin kasvun kaava on jakson myynti vähennettynä viime vuoden saman ajanjakson myynnellä jaettuna viime vuoden saman ajanjakson myynnellä.)

Aloitetaan seuraavasta mittarimäärityksestä.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

Mittari tuottaa oikean tuloksen, mutta katsotaan nyt, miten sitä voidaan parantaa.

Suorituskyvyn parantaminen

Huomaa, että kaava toistaa lausekkeen, joka laskee "samana ajanjaksona viime vuonna". Tämä kaava on tehoton, koska Power BI:n on arvioitava sama lauseke kahdesti. Mittarimääritystä voidaan tehostaa käyttämällä muuttujaa VAR.

Seuraavassa mittarimäärityksessä esitetään parannus. Se käyttää lauseketta, joka määrittää viime vuoden saman ajanjakson tuloksen muuttujaan nimeltä SalesPriorYear. Muuttujaa käytetään sitten kahdesti RETURN-lausekkeessa.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

Mittari tuottaa edelleen oikean tuloksen, mutta noin kaksi kertaa nopeammin.

Luettavuuden parantaminen

Huomaa edellisessä mittarimäärityksessä, miten muuttujan nimen valinta tekee RETURN-lausekkeesta helpomman ymmärtää. Lauseke on lyhyt ja kuvaava.

Virheenkorjauksen yksinkertaistaminen

Muuttujat voivat myös auttaa kaavan virheenkorjauksessa. Jos haluat testata muuttujalle määritettyä lauseketta, kirjoita RETURN-lauseke tilapäisesti uudelleen tulostamaan muuttuja.

Seuraava mittarimääritys palauttaa vain SalesPriorYear-muuttujan . Huomaa, miten se kommentoi aiottua RETURN-lauseketta. Tämän tekniikan avulla voit helposti palauttaa sen takaisin virheenkorjauksen jälkeen.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

Vähentää monimutkaisuutta

Aiemmissa DAX-versioissa muuttujia ei vielä tuettu. Monimutkaiset lausekkeet, jotka ottivat käyttöön uusia suodatinkonteksteja , edellyttivät EARLIER - tai EARLIEST-DAX-funktioiden käyttämistä viittaamaan uudempiin suodatinkonteksteihin. Valitettavasti tietojen mallintajat pitivät näitä funktioita vaikeina ymmärtää ja käyttää.

Muuttujia arvioidaan aina RETURN-lausekkeen suodattimien ulkopuolella. Tästä syystä muuttuja tuottaa saman tuloksen muokatun suodatinkontekstin yhteydessä kuin EARLIEST-funktio. EARLIER- tai EARLIEST-funktioiden käyttöä voidaan siis välttää. Se tarkoittaa, että voit nyt kirjoittaa yksinkertaisempia kaavoja, joita on helpompi ymmärtää.

Harkitse seuraavaa lasketun sarakkeen määritystä, joka on lisätty Subcategory-taulukkoon . Se arvioi kunkin tuotteen aliluokan sijoituksen Subcategory Sales -sarakkeen arvojen perusteella.

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

EARLIER-funktiolla viitataan Subcategory Sales -sarakkeen arvoon nykyisessä rivikontekstissa.

Lasketun sarakkeen määritystä voidaan parantaa käyttämällä muuttujaa EARLIER-funktion sijaan. CurrentSubcategorySales-muuttuja tallentaa Subcategory Sales -sarakkeen arvon nykyisessä rivikontekstissa, ja RETURN-lauseke käyttää sitä muokatun suodatinkontekstin yhteydessä.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1