Delen via


Variabelen gebruiken om uw DAX formules te verbeteren

Als gegevensmodeller kan het schrijven van and en het opsporen van fouten in sommige DAX berekeningen uitdagend zijn. Het is gebruikelijk dat complexe berekeningsvereisten vaak betrekking hebben op het schrijven van samengestelde or complexe expressies. Samengestelde expressies kunnen betrekking hebben op het gebruik van vele geneste functies, and en mogelijk het hergebruik van expressielogica.

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

In dit artikel laten we de first drie voordelen zien met behulp van een voorbeeld measure voor year-over-year verkoopgroei (YoY). (De formule voor de verkoopgroei van YoY is periodeverkoop, min verkoop voor dezelfde periode lastyear, gedeeld door de verkoop voor dezelfde periode lastyear.)

Laten we beginnen met de volgende measure definitie.

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

De measure produceert het juiste resultaat, maar laten we now zien hoe dit kan worden verbeterd.

Prestaties verbeteren

U ziet dat de formule de expressie herhaalt waarmee 'dezelfde periode lastyear' wordt berekend. Deze formule is inefficiënt, omdat Power BI twee keer dezelfde expressie moet evaluate. De definitie van de measure kan efficiënter worden gemaakt met behulp van een variabele, VAR.

De volgende measure definitie vertegenwoordigt een verbetering. Er wordt een expressie gebruikt om het resultaat 'dezelfde periode lastyear' 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 measure blijft het juiste resultaat produceren, and doet dit in ongeveer de helft van de query time.

Leesbaarheid verbeteren

In de definitie van previousmeasure ziet u hoe de return-expressie eenvoudiger te begrijpen is door de keuze van de variabelenaam. De uitdrukking is kort and zelfbeschrijvend.

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 measure definitie retourneert alleen de variabele SalesPriorYear. U ziet hoe hiermee de beoogde RETURN-expressie wordt uitgecommentarieerd. 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

Complexiteit verminderen

In earlier versies van DAXwerden variabelen not nog ondersteund. Complexe expressies die nieuwe filter contexten hebben geïntroduceerd, moesten de EARLIERorEARLIESTDAX functies gebruiken om te verwijzen naar buitenste filter contexten. Helaas vonden gegevensmodelleerders deze functies moeilijk te begrijpen and gebruik.

Variabelen worden altijd geëvalueerd buiten filters waarop uw RETURN-expressie van toepassing is. Als u daarom een variabele binnen een gewijzigde filter context gebruikt, krijgt deze hetzelfde resultaat als de EARLIEST-functie. Het gebruik van de EARLIERorEARLIEST functies kan daarom worden vermeden. Dit betekent dat u formules kunt now schrijven die minder complex zijn, and die gemakkelijker te begrijpen zijn.

Houd rekening met de volgende berekende kolomdefinitie die is toegevoegd aan de tabel Subcategorie. Het evalueert een rank voor elke product subcategorie op basis van de kolom Subcategorie Sales kolom values.

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

De functie EARLIER wordt gebruikt om te verwijzen naar de kolom Subcategorie Salesvaluein 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 kolom Subcategorie Sales kolom valueop in de huidige rijcontext, and de RETURN-expressie deze gebruikt in een gewijzigde filter context.

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