Variabelen gebruiken om uw DAX-formules te verbeteren

Als gegevensmodeller kan het schrijven en opsporen van fouten in sommige DAX-berekeningen lastig zijn. Het is gebruikelijk dat complexe berekeningsvereisten vaak betrekking hebben op het schrijven van samengestelde of complexe expressies. Samengestelde expressies kunnen betrekking hebben op het gebruik van veel geneste functies en mogelijk het hergebruik van expressielogica.

Door variabelen in uw DAX-formules te gebruiken, kunt u complexere en efficiënte berekeningen schrijven. Variabelen kunnen de prestaties, betrouwbaarheid, leesbaarheid verbeteren en complexiteit verminderen.

In dit artikel laten we de eerste drie voordelen zien met behulp van een voorbeeldmeting voor de verkoopgroei van jaar tot jaar (YoY). (De formule voor de verkoopgroei van YoY is periodeverkoop, min verkoop voor dezelfde periode vorig jaar, gedeeld door de verkoop voor dezelfde periode vorig jaar.)

Laten we beginnen met de volgende metingsdefinitie.

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

De meting produceert het juiste resultaat, maar laten we nu zien hoe deze kan worden verbeterd.

De prestaties verbeteren

U ziet dat de formule de expressie herhaalt waarmee 'dezelfde periode vorig jaar' wordt berekend. Deze formule is inefficiënt, omdat Power BI dezelfde expressie tweemaal moet evalueren. De metingdefinitie kan efficiënter worden gemaakt met behulp van een variabele, VAR.

De volgende metingsdefinitie vertegenwoordigt een verbetering. Er wordt een expressie gebruikt om het resultaat 'dezelfde periode vorig jaar' toe te wijzen aan een variabele met de naam SalesPriorYear. De variabele wordt vervolgens tweemaal gebruikt in de RETURN-expressie.

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

De meting blijft het juiste resultaat produceren en doet dit in ongeveer de helft van de querytijd.

Leesbaarheid verbeteren

In de vorige metingsdefinitie ziet u hoe de naam van de variabele de RETURN-expressie eenvoudiger te begrijpen maakt. De expressie is kort en zelfbeschrijfd.

Foutopsporing vereenvoudigen

Variabelen kunnen u ook helpen bij het opsporen van fouten in een formule. Als u een expressie wilt testen die is toegewezen aan een variabele, herschrijft u de RETURN-expressie tijdelijk om de variabele uit te voeren.

De volgende metingdefinitie retourneert alleen de variabele SalesPriorYear . U ziet hoe hiermee de beoogde RETURN-expressie wordt weergegeven. Met deze techniek kunt u deze eenvoudig terugzetten zodra uw foutopsporing is voltooid.

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

Verminder complexiteit

In eerdere versies van DAX werden variabelen nog niet ondersteund. Complexe expressies die nieuwe filtercontexten hebben geïntroduceerd, waren vereist om de DAX-functies EARLIER of EARLIEST te gebruiken om te verwijzen naar buitenste filtercontexten. Helaas vonden gegevensmodelleerders deze functies moeilijk te begrijpen en te gebruiken.

Variabelen worden altijd geëvalueerd buiten de filters die uw RETURN-expressie toepast. Als u daarom een variabele binnen een gewijzigde filtercontext gebruikt, wordt hetzelfde resultaat bereikt als de functie EARLIEST. Het gebruik van de functies EARLIER of EARLIEST kan daarom worden vermeden. Dit betekent dat u nu formules kunt schrijven die minder complex zijn en die gemakkelijker te begrijpen zijn.

Houd rekening met de volgende berekende kolomdefinitie die is toegevoegd aan de tabel Subcategorie . De classificatie evalueert een rang voor elke subcategorie van het product op basis van de kolomwaarden Subcategorie Verkoop .

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

De functie EARLIER wordt gebruikt om te verwijzen naar de kolomwaarde Subcategorie Verkoop in de huidige rijcontext.

De definitie van de berekende kolom kan worden verbeterd met behulp van een variabele in plaats van de functie EARLIER. De variabele CurrentSubcategorySales slaat de kolomwaarde Subcategory Sales op in de huidige rijcontext en de RETURN-expressie gebruikt deze in een gewijzigde filtercontext.

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