Použití proměnných ke zlepšení vzorců DAX

Jako modelátor dat může být psaní a ladění některých výpočtů DAX náročné. Je běžné, že složité požadavky na výpočty často zahrnují psaní složených nebo složitých výrazů. Složené výrazy můžou zahrnovat použití mnoha vnořených funkcí a případně opakované použití logiky výrazů.

Použití proměnných ve vzorcích DAX vám může pomoct psát složitější a efektivnější výpočty. Proměnné můžou zlepšit výkon, spolehlivost, čitelnost a snížit složitost.

V tomto článku předvedeme první tři výhody pomocí ukázkové míry pro meziroční růst prodeje (YoY). (Vzorec pro meziroční růst prodeje je prodej období, minus prodeje za stejné období minulý rok, dělený prodejem za stejné období minulý rok.)

Začněme následující definicí míry.

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

Míra vytvoří správný výsledek, ale teď se podíváme, jak se dá vylepšit.

Zvýšení výkonu

Všimněte si, že vzorec opakuje výraz, který vypočítá "stejné období minulý rok". Tento vzorec je neefektivní, protože power BI vyžaduje, aby stejný výraz vyhodnotil dvakrát. Definici míry lze zefektivnit pomocí proměnné VAR.

Následující definice míry představuje zlepšení. Pomocí výrazu přiřadí výsledek stejného období minulý rok proměnné s názvem SalesPriorYear. Proměnná se pak ve výrazu RETURN použije dvakrát.

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

Míra pokračuje ve správném výsledku a za přibližně polovinu času dotazu to provede.

Zlepšení čitelnosti

V předchozí definici míry si všimněte, jak volba názvu proměnné usnadňuje pochopení výrazu RETURN. Výraz je krátký a samopisný.

Zjednodušení ladění

Proměnné vám také můžou pomoct ladit vzorec. Chcete-li otestovat výraz přiřazený k proměnné, dočasně přepíšete výraz RETURN pro výstup proměnné.

Následující definice míry vrátí pouze proměnnou SalesPriorYear . Všimněte si, jak komentuje zamýšlený výraz RETURN. Tato technika umožňuje snadno vrátit zpět po dokončení ladění.

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

Omezte složitost

V dřívějších verzích jazyka DAX se proměnné zatím nepodporovaly. Komplexní výrazy, které zavedly nové kontexty filtru, se vyžadovaly k použití funkcí EARLIER nebo EARLIEST DAX pro odkazování na kontexty vnějšího filtru. Modelování dat bohužel zjistilo, že tyto funkce jsou obtížně pochopitelné a používané.

Proměnné se vždy vyhodnocují mimo filtry, které výraz RETURN použije. Z tohoto důvodu při použití proměnné v upraveném kontextu filtru dosáhne stejného výsledku jako funkce EARLIEST. Použití funkcí EARLIER nebo EARLIEST je proto možné se vyhnout. To znamená, že teď můžete psát vzorce, které jsou méně složité a které jsou snadněji pochopitelné.

Představte si následující definici počítaného sloupce přidanou do tabulky Podkategorie . Vyhodnocuje pořadí pro každou podkategorii produktu na základě hodnot sloupce Subcategory Sales .

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

Funkce EARLIER slouží k odkazování na hodnotu sloupce Subcategory Sales v kontextu aktuálního řádku.

Definici počítaného sloupce lze vylepšit pomocí proměnné místo funkce EARLIER. Proměnná CurrentSubcategorySales ukládá hodnotu sloupce Subcategory Sales v kontextu aktuálního řádku a výraz RETURN ho používá v upraveném kontextu filtru.

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