Zdieľať cez


Vylepšenie vzorcov DAX pomocou premenných

Písanie a ladenie niektorých DAX výpočtov môže byť pre nás ako modelára údajov náročné. Požiadavky zložitých výpočtov bežne vyžadujú písanie zložených alebo zložitých výrazov. Zložené výrazy môžu zahŕňať použitie mnohých vnorených funkcií a prípadne aj opätovné použitie logiky výrazu.

Používanie premenných vo vzorcoch DAX vám môže pomôcť pri písaní zložitejších a efektívnejších výpočtov. Premenné môžu zlepšiť výkon, spoľahlivosť, čitateľnosť a znížiť zložitosť.

V tomto článku vám ukážeme prvé tri výhody s použitím vzorovej mierky pre medziročný rast predaja. (Vzorec pre medziročný rast predaja je predaj za obdobie, mínus predaj za rovnaké obdobie v minulom roku, delené predajom za rovnaké obdobie v minulom roku.)

Začnime nasledujúcou definíciou mierky.

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

Táto mierka poskytuje správny výsledok, ale pozrime sa, ako ju možno zlepšiť.

Zlepšenie výkonu

Všimnite si, že vo vzorci sa opakuje výraz, ktorý vypočíta "rovnaké obdobie v minulom roku". Tento vzorec je neefektívny, pretože vyžaduje, aby služba Power BI vyhodnotila rovnaký výraz dvakrát. Definícia mierky sa dá zefektívniť pomocou premennej VAR.

Nasledujúca definícia mierky predstavuje zlepšenie. Pomocou výrazu priradí výsledok "rovnaké obdobie v minulom roku" k premennej s názvom SalesPriorYear. Premenná sa potom použije dvakrát vo výraze RETURN.

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

Mierka naďalej poskytuje správny výsledok, no robí to za približne polovičný čas dotazu.

Zlepšenie čitateľnosti

V predchádzajúcej definícii mierky si všimnite, ako výber názvu premennej zjednodušuje zrozumiteľnosť výrazu RETURN. Výraz je krátky a samopopisný.

Zjednodušiť ladenie

Premenné vám tiež môžu pomôcť pri ladení vzorca. Ak chcete otestovať výraz priradený k premennej, môžete dočasne prepísať výraz RETURN tak, aby bola jeho výstupom premenná.

Nasledujúca definícia mierky vráti iba premennú SalesPriorYear. Všimnite si, ako vykomentuje zamýšľaný výraz RETURN. Táto technika vám ho umožňuje jednoducho vrátiť späť po dokončení ladenia.

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

Znížiť zložitosť

V starších verziách funkcie DAXsa ešte premenné nepodporovali. Na použitie funkcií EARLIER alebo EARLIESTDAX odkazu na vonkajšie kontexty filtra boli potrebné zložité výrazy, ktoré zavádzali nové kontexty filtra. Pre modelárov údajov žiaľ boli tieto funkcie ťažké na pochopenie a použitie.

Premenné sa vždy vyhodnocujú mimo filtrov, ktoré používa váš výraz RETURN. Z tohto dôvodu dosiahne pri použití premennej v rámci upraveného kontextu filtra rovnaký výsledok ako funkcia EARLIEST. Preto sa možno vyhnúť použitiu funkcií EARLIER alebo EARLIEST. Znamená to, že teraz môžete písať vzorce, ktoré sú menej zložité a ľahšie pochopiteľné.

Pozrime sa na nasledujúcu definíciu vypočítaného stĺpca pridanú do tabuľky Subcategory tabuľke. Vyhodnotí poradie pre každú podkategóriu produktu na základe hodnôt stĺpca Subcategory Sales.

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

Funkcia EARLIER odkazuje na hodnotu stĺpca Subcategory Sales stĺpca v aktuálnom kontexte riadka.

Definíciu vypočítaného stĺpca možno zlepšiť použitím premennej namiesto funkcie EARLIER. Premenná CurrentSubcategorySales uchováva hodnotu Predaj podľa podkategórie stĺpca v aktuálnom kontexte riadkaa výraz RETURN ju používa v upravenom kontexte filtra.

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