Aanvullende time intelligence-berekeningen

Voltooid

Er zijn andere DAX-functies voor time intelligence waarmee een enkele datum wordt geretourneerd. Meer informatie over deze functies vindt u in twee verschillende scenario's.

De FIRSTDATE functies en DAX LASTDATE retourneren de eerste en laatste datum in de huidige filtercontext voor de opgegeven kolom met datums.

Nieuwe exemplaren berekenen

Een ander gebruik van time intelligence-functies bestaat uit het tellen van nieuwe exemplaren. In het volgende voorbeeld ziet u hoe u het aantal nieuwe klanten kunt berekenen voor een bepaalde periode. Een nieuwe klant wordt geteld in de periode waarin deze zijn eerste aankoop heeft gedaan.

De eerste taak is om de volgende meting toe te voegen aan de tabel Verkoop , waarmee het aantal afzonderlijke klanten wordt geteld tot heden (LTD). Levensduur tot heden betekent van het allereerste begin tot de laatste datum in de filtercontext. Maak de meting op als een geheel getal met behulp van het scheidingsteken voor duizendtallen.

Customers LTD =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD

Voeg de meting Customers LTD toe aan het matrix-besturingselement. U ziet dat er een resultaat wordt gegenereerd van afzonderlijke klanten LTD tot het einde van elke maand.

Een afbeelding toont een matrix-besturingselement met groepering op Year en Month in de rijen en Revenue, Revenue YTD, Revenue YoY % en Customers LTD.

De DATESBETWEEN functie retourneert een tabel die een kolom met datums bevat die begint met een opgegeven begindatum en doorgaat tot een bepaalde einddatum. Als de begindatum BLANK is, wordt de eerste datum in de kolom Date gebruikt. (Andersom wordt als de einddatum BLANK is de laatste datum in de kolom Date gebruikt.) In dit geval wordt de einddatum bepaald door de functie MAX, die de laatste datum in de filtercontext retourneert. Als de maand augustus 2017 zich in de filtercontext bevindt, retourneert de functie MAX 31 augustus 2017 en retourneert de DATESBETWEEN functie alle datums tot en met 31 augustus 2017.

U wijzigt u de meting vervolgens door de naam ervan te wijzigen in New Customers en door een tweede variabele toe te voegen voor het opslaan van het aantal afzonderlijke klanten voorafgaand aan de periode in de filtercontext. De RETURN component trekt deze waarde nu af van LTD-klanten om een resultaat te produceren, dat het aantal nieuwe klanten in de periode is.

New Customers =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
    'Sales Order'[Channel] = "Internet"
    )
VAR CustomersPrior =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MIN('Date'[Date]) - 1
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD - CustomersPrior

Een afbeelding toont een matrix-besturingselement met groepering op Year en Month in de rijen en Revenue, Revenue YTD, Revenue YoY % en New Customers. De waarden voor New Customers zijn gemarkeerd.

Voor de variabele CustomersPrior ziet u dat de DATESBETWEEN functie datums tot de eerste datum in filtercontext min één bevat. Omdat Microsoft Power BI intern datums als getallen opslaat, kunt u getallen optellen of aftrekken om een datum te verschuiven.

Berekeningen van momentopnamen

Zo nu en dan worden feitelijke gegevens opgeslagen als momentopnamen in de tijd. Veelvoorkomende voorbeelden zijn voorraadniveaus of rekeningsaldi. Een momentopname van waarden wordt periodiek geladen in de tabel.

Bij het samenvatten van momentopnamewaarden (zoals voorraadniveaus) kunt u de waarden voor elke dimensie behalve de datumdimensie samenvatten. Het optellen van voorraadniveaus voor productcategorieën resulteert in een zinvolle samenvatting, maar het optellen van voorraadniveaus voor datums niet. Het is niet erg handig om het voorraadniveau van gisteren op te tellen bij het voorraadniveau van vandaag (tenzij u een gemiddelde wilt).

Wanneer u momentopnametabellen samenvat, kunnen metingformules DAX-functies voor time intelligence gebruiken om een enkel datumfilter af te dwingen.

In het volgende voorbeeld gaat u een scenario bekijken voor het bedrijf Adventure Works. Schakel over naar modelweergave en selecteer het modeldiagram Inventory.

Een afbeelding toont een modeldiagram dat uit drie tabellen bestaat: Product, Date en Inventory. De tabellen Product en Date hebben elk een één-op-veel-relatie met de tabel Inventory.

U ziet dat in het diagram drie tabellen worden weergegeven: Product, Datum en Inventaris. In de tabel Voorraad worden momentopnamen van eenheidssaldi voor elke datum en elk product opgeslagen. Belangrijk: de tabel bevat geen ontbrekende datums en geen dubbele vermeldingen voor een product op dezelfde datum. Daarnaast is het laatste momentopnamerecord opgeslagen voor de datum van 15 juni 2020.

Schakel nu over naar de rapportweergave en selecteer pagina 2 van het rapport. Voeg de kolom UnitsBalance van de tabel Inventory toe aan de matrixvisual. De standaardsamenvatting is ingesteld op somwaarden.

Een afbeelding toont een matrix-besturingselement met de titel Y2020 Mountain-200 Bike Stock. Product is gegroepeerd in de rijen en Month is gegroepeerd in de kolommen. Voor elk product en elke maand worden hoge waarden weergegeven.

Deze configuratie van het besturingselement is een voorbeeld van hoe u een momentopname waarde niet moet samenvatten. Het optellen van dagelijkse momentopnamesaldi levert geen zinvol resultaat op. Verwijder daarom het veld UnitsBalance uit het matrix-besturingselement.

Nu voegt u een meting toe aan de tabel Inventory waarmee de waarde UnitsBalancevoor één datum wordt opgeteld. De datum is de laatste datum van elke periode. Dit wordt bereikt met behulp van de LASTDATE functie. Maak de meting op als een geheel getal met het scheidingsteken voor duizendtallen.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTDATE('Date'[Date])
)

Notitie

U ziet dat de formule van de meting gebruikmaakt van de SUM functie . Er moet een statistische functie worden gebruikt (metingen staan directe verwijzingen naar kolommen niet toe), maar aangezien er slechts één rij bestaat voor elk product voor elke datum, wordt de SUM functie slechts over één rij uitgevoerd.

Voeg de meting Stock on Hand toe aan het matrix-besturingselement. De waarde voor elk product is nu gebaseerd op het laatst vastgelegde saldo van eenheden voor elke maand.

Een afbeelding toont een matrix-besturingselement met de titel Y2020 Mountain-200 Bike Stock. Product is gegroepeerd in de rijen en Month is gegroepeerd in de kolommen. Voor elk product en elke maand worden lagere waarden weergegeven. Juni 2020 en het totaal zijn BLANK.

De meting retourneert de waarden BLANK voor juni 2020, omdat er voor de laatste datum in juni geen record bestaat. Op basis van de gegevens heeft deze nog niet plaatsgevonden.

Filteren op de laatste datum in de filtercontext heeft inherente problemen: Een vastgelegde datum bestaat mogelijk niet omdat deze nog niet heeft plaatsgevonden of omdat er geen voorraadsaldi zijn geregistreerd in het weekend.

De volgende stap bestaat uit het aanpassen van de metingformule om de laatste datum met een resultaat dat niet BLANK is te bepalen en vervolgens te filteren op die datum. U kunt deze taak uitvoeren met behulp van de LASTNONBLANK DAX-functie.

Gebruik de volgende metingdefinitie om de meting Stock on Hand te wijzigen.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTNONBLANK(
        'Date'[Date],
        CALCULATE(SUM(Inventory[UnitsBalance]))
    )
)

In het matrix-besturingselement ziet u de waarden voor 2020 juni en het totaal (het hele jaar).

Een afbeelding toont dat het matrix-besturingselement nu waarden voor juni 2020 en het totaal heeft.

De LASTNONBLANK functie is een iterator-functie. Hiermee wordt de laatste datum die een resultaat genereert dat niet BLANK is geretourneerd. Dit resultaat wordt gerealiseerd door alle datums in de filtercontext in aflopende chronologische volgorde te herhalen. (Omgekeerd wordt de FIRSTNONBLANK iteratie in oplopende chronologische volgorde uitgevoerd.) Voor elke datum wordt de doorgegeven expressie geëvalueerd. Wanneer er een resultaat dat niet BLANK is wordt aangetroffen, retourneert de functie de datum. Die datum wordt vervolgens gebruikt om de CALCULATE functie te filteren.

Notitie

De LASTNONBLANK functie evalueert de expressie in rijcontext. De CALCULATE functie moet worden gebruikt om de rijcontext over te schakelen naar filtercontext om de expressie correct te evalueren.

U moet nu de kolom UnitsBalance van de tabel Inventory verbergen. Hiermee wordt voorkomen dat rapportauteurs momentopnamen van saldi van eenheden onjuist samenvatten.