Változók használata a DAX-képletek javításához

Adatmodellezőként kihívást jelenthet néhány DAX-számítás írása és hibakeresése. Gyakori, hogy az összetett számítási követelmények gyakran összetett vagy összetett kifejezések írását is magukban foglalják. Az összetett kifejezések számos beágyazott függvény használatát és a kifejezéslogika újrafelhasználását is magukban foglalhatják.

Ha változókat használ a DAX-képletekben, összetettebb és hatékonyabb számításokat írhat. A változók javíthatják a teljesítményt, a megbízhatóságot, az olvashatóságot és csökkenthetik az összetettséget.

Ebben a cikkben az első három előnyt mutatjuk be egy példamérték használatával az évenkénti (YoY) értékesítések növekedéséhez. (A YoY-értékesítések növekedésének képlete az időszaki értékesítések, mínusz az előző év azonos időszakának értékesítéseinek mínusza, osztva az előző év azonos időszakának értékesítésével.)

Kezdjük a következő mértékdefinícióval.

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

A mérték a megfelelő eredményt adja, de most nézzük meg, hogyan javítható.

A teljesítmény javítása

Figyelje meg, hogy a képlet megismétli az "előző év azonos időszakát" kiszámító kifejezést. Ez a képlet nem hatékony, mivel a Power BI-nak kétszer kell kiértékelnie ugyanazt a kifejezést. A mértékdefiníció hatékonyabbá tehető egy változó, a VAR használatával.

A következő mértékdefiníció javulást jelent. Kifejezéssel rendeli hozzá az "előző év azonos időszaka" eredményt egy SalesPriorYear nevű változóhoz. A változót ezután kétszer használja a RETURN kifejezés.

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

A mérték továbbra is a megfelelő eredményt adja, és ezt a lekérdezési idő körülbelül felében teszi.

Az olvashatóság javítása

Az előző mértékdefinícióban figyelje meg, hogy a változónév kiválasztása egyszerűbbé teszi a RETURN kifejezést. A kifejezés rövid és önleíró.

A hibakeresés egyszerűsítése

A változók segíthetnek a képletek hibakeresésében is. Egy változóhoz rendelt kifejezés teszteléséhez ideiglenesen újraírhatja a RETURN kifejezést a változó kimenetének érdekében.

Az alábbi mértékdefiníció csak a SalesPriorYear változót adja vissza. Figyelje meg, hogyan fűzi hozzá a kívánt RETURN kifejezést. Ez a technika lehetővé teszi, hogy a hibakeresés befejezése után egyszerűen visszaállítsa azt.

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

Egyszerű használat

A DAX korábbi verzióiban a változók még nem támogatottak. Az új szűrőkörnyezeteket bevezetett összetett kifejezéseknek a külső szűrőkörnyezetekre való hivatkozáshoz az EARLIER vagy a EARLIEST DAX függvényt kellett használniuk. Sajnos az adatmodellezők nehéznek találták ezeket a függvényeket megérteni és használni.

A változók kiértékelése mindig azon szűrőken kívül történik, amelyekre a RETURN kifejezés vonatkozik. Ezért ha módosított szűrőkörnyezetben használ változót, az ugyanazt az eredményt éri el, mint az EARLIEST függvény. Az EARLIER vagy a EARLIEST függvények használata ezért elkerülhető. Ez azt jelenti, hogy mostantól kevésbé összetett és könnyebben érthető képleteket írhat.

Vegye figyelembe az alkategóriatáblához hozzáadott alábbi számított oszlopdefiníciót . Kiértékeli az egyes termék alkategóriák rangsorát a Sales (Értékesítések ) oszlop értékei alapján.

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

Az EARLIER függvény az aktuális sorkörnyezetBen az Alkategória Értékesítés oszlopértékére hivatkozik.

A számított oszlopdefiníció az EARLIER függvény helyett egy változóval javítható. A CurrentSubcategorySales változó a Subcategory Sales oszlop értékét az aktuális sorkörnyezetben tárolja, a RETURN kifejezés pedig egy módosított szűrőkörnyezetben használja.

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