DAX Language LuckyTemplates-opplæring på omvendt TOPN

I dette blogginnlegget skal vi ta en titt på et spørsmål som ble stilt på LuckyTemplates-forumet og bruke en DAX-språklig LuckyTemplates-teknikk for å løse det. I tilfelle du vil følge med og laste ned filene, besøk LuckyTemplates-forumet og gå til . Du kan se hele videoen av denne opplæringen nederst på denne bloggen.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

For å forklare scenariet som vi skal dekke, har vi en enkel tabell som eksempel. I den første kolonnen har vi Økonominivå 1 . I den andre kolonnen har vi en dato som heter Fullført. I den siste kolonnen har vi kombinasjonen av økonominivå og fullført dato, som vi vil gi navnet Inntekt .

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Så har vi en slicer for dato og kundenavn .

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Det vi ønsker å gjøre for en bestemt tidsperiode er å identifisere de tre beste datoene som ikke er null. Og så i de tre beste datoene ønsker vi å identifisere det økonomiske nivået.

I den første versjonen av tiltaket listet jeg opp datoene som er mindre enn 29.4.2021 der vi har noen inntekter.

Og på disse datoene ønsker vi å identifisere de økonomiske nivåene som har gitt noen inntekter. Jeg vil forklare deg hvordan vi kan oppnå den beregningen.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Innholdsfortegnelse

Datamodellering

Før du skriver selve DAX, la oss ta en rask titt på datamodellen som inneholder flere tabeller. Vi er kun interessert i datotabellen , datatabellen , jobbkategoritabellen og kundetabellen .

Vær oppmerksom på at kundetabellen egentlig ikke er viktig fordi den bare brukes inne i en slicer.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Inntektsmålet blir beregnet i datatabellen. Jobbkategorien inneholder det økonomiske nivået som vi har på matrisen. Da bruker vi Dato-kolonnen fra Dato-tabellen i sliceren vår.

Versjon 1

La oss kvitte oss med alt fra matrisen og starte fra bunnen av. Jeg skal lage et nytt mål og kalle det V1 fordi dette kommer til å bli versjon én. Vi skal også ta en titt på to andre varianter.

Forbereder filterkonteksten

Det første vi skal gjøre er å hente alle verdiene til det økonomiske nivået fra filterkonteksten. Vi oppretter en og gir den navnet FinancialLevelInFilterContext .

DAX Language LuckyTemplates-opplæring på omvendt TOPN

For å hente verdiene fra filterkonteksten, skal vi bruke tabellen på jobbkategorien som inneholder kolonnen finansnivå. Deretter må vi lage en annen variabel og gi den navnet Resultat . Så skriv , og lukk den også.

I det første argumentet har vi et utvalg over datokutteren. I disse datoene ønsker vi å identifisere datoene som ikke har en 0 og har minst en viss inntekt.

Hvis du vil ha tilgang til alle datoene som er valgt i den sliceren, må vi bruke tabellen over dato.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Og siden vi har det økonomiske nivået på matrisen, må vi også sørge for at vi fjerner den spesielle verdien fra filterkonteksten. Vi kan bruke kategorien over jobb og deretter skrive finansnivå 1.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Nå som vår filterkontekst er forberedt, kan vi skrive den innerste beregningen for CALCUATE. Først deklarerer vi en variabel, som vil være en kombinasjon av finansnivå og datokolonnen som vi har sett i den første tabellen.

Deretter bruker vi og datatabellen til å oppsummere disse to tabellene: Jobbkategori og Datotabell.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Dette vil gi kombinasjonen av det økonomiske nivået og datokolonnen som finnes i datatabellen. Deretter skal vi lage en annen variabel der vi lagrer verdien av inntektsraden for den første variabelen vi har laget.

Navnet på denne variabelen vil være FinancialLevelAndDatesWithRevenue . Koden til denne variabelen vil være over den forrige variabelen. Deretter vil vi lage en virtuell kolonne som vil være Inntekt for å starte kontekstovergangen. Så for hver rad i denne variabelen har vi tildelt inntektene.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Denne tabellen inneholder inntektene, som også har null. Vi må filtrere ut disse radene med null. For å gjøre dette kan vi lage en annen variabel og navngi den som RemoveZeroes .

Vi bruker den forrige variabelen, og sørg for at inntekten ikke er lik null. Den kan være større enn null eller mindre enn null, men bør ikke være strengt tatt lik null.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Og så skal vi hente datoen fra RemoveZeroes-variabelen . For å gjøre dette kan vi lage en annen variabel og gi den navnet KeepOnlyDates .

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Jeg kan bruke for å bli kvitt duplikatdatoene som blir returnert av .

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Deretter skal vi identifisere de tre beste datoene i synkende rekkefølge. Vi bruker en annen variabel og gir den navnet Last3Dates , og bruker deretter .

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Deretter bruker vi de tre siste datoene i datokolonnen, og bruker deretter et delimeter.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

La oss dra og slippe vårt nyopprettede mål inne i den matrisen. Resultatet vi får er 31/03/2021, 07/04/2021 og 02/04/2021. Dette betyr at tiltaket vårt fungerer.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

La oss gå tilbake til redaktøren og bli kvitt RETURN CONCATENATEX-delen. For å hente de tre siste datoene, er det vi kan gjøre å sjekke hvilke rader fra RemoveZeroes -variabelen som faktisk er en del av de tre siste datoene.

Og for det vil vi lage en annen variabel DatesInLast3Dates , og bruke FILTER-funksjonen på RemoveZeroes . Dette kommer til å returnere en tabell som består av en jobbkategori og dato.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Vi vil oppsummere inntektskolonnen som vi har opprettet i den tabellen. La oss returnere SUMX over DatesInLast3Dates, og deretter oppsummere inntektskolonnen.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Med denne beregningen får vi kun én enkelt verdi for hver rad, fordi vi har fjernet kategorien Job fra filterkonteksten.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Vi bruker variabelen som vi har opprettet i starten for å sjekke om hver rad i DatesInLast3Dates -variabelen er tilgjengelig i filterkonteksten. Vi kan skrive en annen variabel og gi den navnet IsInFilterContext .

Dette vil filtrere datoene i DatesInLast3Dates- variabelen. Deretter vil jeg returnere SUMX over IsInFilter-konteksten og oppsummere inntektskolonnen.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Når vi trykker på Enter kan du se at vi får samme resultat som vi hadde i begynnelsen.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Bekrefte resultatet av beregningen av DAX Language LuckyTemplates

For å verifisere at vi faktisk får det riktige resultatet, kan vi lage en ny CALCULATE-tabell som vil hjelpe oss med å feilsøke, identifisere og verifisere at koden vi har skrevet så langt faktisk returnerer det riktige resultatet.

La oss lage en kopi av koden vi har skrevet så langt. Jeg skal ganske enkelt kopiere delen som er uthevet nedenfor, gå tilbake for å lage en ny tabell og lime inn den uthevede koden. Vi skal ikke gidde å navngi denne tabellen fordi den ikke er av interesse for oss.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Og vi kan ganske enkelt skrive RETURN DatesInLast3Dates . Hvis jeg klikker på Bekreft , får vi en tabell, men vi vet at den faktisk ikke returnerer riktig resultat ennå fordi vi faktisk trenger å etterligne oppførselen til sliceren.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Vi kan pakke den koden inn i en CALCUATETABLE og rykke inn alt. I den siste delen skal jeg skrive at datoen skal være større enn eller lik 2021-03-15 og at kundenavnet skal være lik DHL Supply Chain .

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Tabellen som vi har laget inne i det målet gir praktisk talt det riktige resultatet. Vi kan bruke en CALCUATETABLE for å bekrefte den virtuelle tabellen du oppretter i beregningen.

Andre DAX Language LuckyTemplates-beregninger

Nå som vi vet at beregningen vår fungerer og forstår hva som faktisk skjer bak kulissene, kan vi se på andre metoder for å beregne det samme problemet. Først av alt, la oss lage et duplikat av tiltaket som vi allerede har opprettet.

Versjon 2

Denne gangen skal vi ikke stole på funksjonene VERDIER og FILTER, så vi blir kvitt dem. Vi fjerner returresultatet, i tillegg til den siste variabelen vi har opprettet i CALCUATE. Deretter konverterer vi CALCULATE til CALCULATETABLE.

Og i stedet for å returnere en skalarverdi, skal vi denne gangen returnere DatesInLast3Dates . Dette vil returnere den samme Kalkyletabellen som vi laget tidligere. Vi skal bruke CALCULATE-funksjonen, og i det første argumentet skal vi beregne inntektsmålet og injisere CALCULATETABLE som filterkontekst.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Når jeg tar det til matrisen, kan du se at vi returnerer den samme totalverdien for hver celle.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Bruke KEEPFILTERS-funksjonen

For øyeblikket vet vi at beregningen bak scenen fungerer som den skal, men hvordan kan vi vite sikkert at for hver celle rapporterer vi kun verdien for det økonomiske nivået?

Ved hjelp av CALCULATETABLE har vi laget en tabell som inneholder økonominivået, datokolonnen og inntektskolonnen. Vi kan bruke nøkkelfilterfunksjonen til å lage et skjæringspunkt mellom filterkonteksten som eksisterer utenfor CALCULATETABLE og den som blir opprettet av CALCULATETABLE.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Når vi klikker på Bekreft, kan vi se at vi rapporterer riktig verdi for hver celle, og at både versjon 1 og versjon 2 returnerer riktig verdi.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Så hvordan fungerer dette? Tabellen CALCULATE kommer til å returnere vedlikeholdsnivået , deretter Utleie , Service Ekstern og Reservedeler . Den kommer til å skape et skjæringspunkt mellom vedlikeholdet og den tabellen.

Utleie kommer til å lage den innledende filterkonteksten, så vil KALKULATABELL returnere alle verdiene i jobbkategorien. Da kommer det til å være et skjæringspunkt mellom Utleiet og bordet som returneres av KALKULATABELL. Vi kommer kun til å returnere tabellene eller radene for den utleiedelen.

Og så til slutt, når vi setter SUMMARIZE inn i filterkonteksten, kommer CALCUATE-funksjonen til å beregne inntektene kun for Rental. Den samme prosessen skjer for hver rad.

Versjon 3

La oss se på en annen måte å beregne den samme beregningen ved å bruke DAX-språklige LuckyTemplates. La oss lage en kopi av versjon 2-målet og lage et nytt mål. Vi skal navngi denne versjon 3.

Tanken bak denne beregningen er at siden vi beregner inntektene ved å bruke CALCUATE-funksjonen, trenger vi ikke å bruke ADDCOLUMNS-delen fordi vi dupliserer det samme i og utenfor CALCULATE. I stedet kan vi ganske enkelt skrive at inntekten ikke skal være lik 0.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Når jeg klikker på Bekreft, må vi sørge for at koden fungerer, så la oss dra målingen inne i matrisen.

Du kan se at koden faktisk returnerer samme verdi for hver celle.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Hvis jeg prøver å endre filterkonteksten ved å endre datoen i Dato-sliceren og velge et par verdier fra kundenavnet, kan du se at alle tre målene faktisk returnerer samme verdi for hver rad.

DAX Language LuckyTemplates-opplæring på omvendt TOPN

Konklusjon

I denne opplæringen lærte vi å bruke en kompleks logikk for å gå tilbake i tid fra sluttdatoen for å identifisere de tre beste datoene. Basert på denne DAX-språklige LuckyTemplates-teknikken, var vi i stand til å beregne inntektene og vise bare de verdiene som eksisterer i filterkonteksten. Det var alt for nå i denne opplæringen.


Pipe In R: Koblingsfunksjoner med Dplyr

Pipe In R: Koblingsfunksjoner med Dplyr

I denne opplæringen lærer du hvordan du kobler funksjoner sammen ved å bruke dplyr-røroperatøren i programmeringsspråket R.

RANKX Deep Dive: A LuckyTemplates DAX-funksjon

RANKX Deep Dive: A LuckyTemplates DAX-funksjon

RANKX fra LuckyTemplates lar deg returnere rangeringen til et spesifikt tall i hver tabellrad som utgjør en del av en liste med tall.

Trekker ut LuckyTemplates-temaer og bilder fra PBIX

Trekker ut LuckyTemplates-temaer og bilder fra PBIX

Lær hvordan du demonterer en PBIX-fil for å trekke ut LuckyTemplates-temaer og bilder fra bakgrunnen og bruke den til å lage rapporten din!

Excel Formulas Cheat Sheet: Mellomveiledning

Excel Formulas Cheat Sheet: Mellomveiledning

Excel Formulas Cheat Sheet: Mellomveiledning

LuckyTemplates-kalendertabell: Hva er det og hvordan du bruker det

LuckyTemplates-kalendertabell: Hva er det og hvordan du bruker det

LuckyTemplates-kalendertabell: Hva er det og hvordan du bruker det

Python i LuckyTemplates: Hvordan installere og sette opp

Python i LuckyTemplates: Hvordan installere og sette opp

Lær hvordan du installerer programmeringsspråket Python i LuckyTemplates og hvordan du bruker verktøyene til å skrive koder og vise visuelle elementer.

Beregning av dynamiske fortjenestemarginer – enkel analyse av LuckyTemplates med DAX

Beregning av dynamiske fortjenestemarginer – enkel analyse av LuckyTemplates med DAX

Lær hvordan du beregner dynamiske fortjenestemarginer ved siden av LuckyTemplates og hvordan du kan få mer innsikt ved å grave dypere inn i resultatene.

Sortering av datotabellkolonner i LuckyTemplates

Sortering av datotabellkolonner i LuckyTemplates

Lær hvordan du sorterer feltene fra kolonner med utvidet datotabell på riktig måte. Dette er en god strategi å gjøre for vanskelige felt.

Finn dine beste produkter for hver region i LuckyTemplates ved å bruke DAX

Finn dine beste produkter for hver region i LuckyTemplates ved å bruke DAX

I denne artikkelen går jeg gjennom hvordan du kan finne de beste produktene dine per region ved å bruke DAX-beregninger i LuckyTemplates, inkludert TOPN- og CALCUATE-funksjonene.

Søppeldimensjon: Hva er det og hvorfor det er alt annet enn søppel

Søppeldimensjon: Hva er det og hvorfor det er alt annet enn søppel

Lær hvordan du bruker en søppeldimensjon for flagg med lav kardinalitet som du ønsker å inkludere i datamodellen din på en effektiv måte.