Gå til indholdet
Modul 7 af 9
Modul 7 · 7 min

Modul 7 - Kun de store handler

CFO'en vil kun se de store handler. FILTER lader dig udtrykke betingelser der ikke kan klares med simpel CALCULATE-syntaks.

Torsdag eftermiddag. CFO igen:

"Sidste lille ting - jeg vil have et tal der kun viser de store handler. Lad os sige over ti tusind kroner pr. ordrelinje. Også på tværs af kategori, så jeg kan se hvor de tunge transaktioner ligger."

Du tænker først: "Bare en CALCULATE." Du prøver:

Store Handler Forsøg =
CALCULATE(
    COUNTROWS( Salg ),
    Salg[Antal] * Salg[EnhedsPris] > 10000  -- ❌
)

Power BI klager. Fejlen lyder: "Et udtryk i CALCULATE-funktionen var ikke et tabel-eller-kolonne-baseret filterudtryk."

Problemet er at simpel CALCULATE-filtre kun forstår sammenligninger med én kolonne: Salg[Antal] > 5 virker. Men Salg[Antal] * Salg[EnhedsPris] > 10000 involverer to kolonner og en beregning. Det forstår simpel CALCULATE ikke.

Du skal have en mere kraftfuld filterfunktion - én der itererer række for række ligesom SUMX og kan vurdere komplekse betingelser.

Det er FILTER.

FILTER - en filtreret tabel

FILTER er ikke et mål i sig selv - den er en byggesten der lever inde i CALCULATE. Den returnerer en tabel hvor kun de rækker der opfylder din betingelse er med.

Syntaks

FILTER(
    <tabel>,
    <betingelse>
)
  • Tabel: Hvilken tabel skal vi filtrere?
  • Betingelse: Et boolsk udtryk der vurderes for hver række. Må gerne involvere flere kolonner og funktioner.

Løsningen

Antal store handler
Store Handler =
CALCULATE(
    COUNTROWS( Salg ),
    FILTER(
        Salg,
        Salg[Antal] * Salg[EnhedsPris] * ( 1 - Salg[Rabat] ) > 10000
    )
)

Hvad sker der her:

  1. FILTER gennemløber hver række i Salg.
  2. For hver række beregner den linjeomsætning og tjekker om den er over 10.000.
  3. De rækker der opfylder betingelsen sendes videre.
  4. CALCULATE tæller dem.

Resultat: antal ordrelinjer over 10.000 kr - beregnet dynamisk, opdaterer sig med slicers.

Tilsvarende - omsætningen fra de store handler

Omsætning fra store handler
Omsætning Store Handler =
CALCULATE(
    SUMX( Salg, Salg[Antal] * Salg[EnhedsPris] * ( 1 - Salg[Rabat] ) ),
    FILTER(
        Salg,
        Salg[Antal] * Salg[EnhedsPris] * ( 1 - Salg[Rabat] ) > 10000
    )
)

Bemærk at den samme beregning gentages to gange - én gang i FILTER, én gang i SUMX. Det er DAX-pris for at have det dynamisk. (I praksis ville en VAR rydde det op; det kommer i modul 9.)

Hvornår FILTER, hvornår almindeligt CALCULATE-filter?

Det her er det vigtigste at få ind i rygmarven:

Brug almindeligt CALCULATE-filter når Brug FILTER når
Filteret er én kolonne mod én værdi Filteret involverer flere kolonner
Salg[Afdeling] = "Salg" Salg[Antal] * Salg[EnhedsPris] > 10000
Produkter[Kategori] = "Audio" Salg[Rabat] > 0 && Salg[Antal] > 1
Hurtigt Langsommere - itererer hele tabellen

Tommelfingerregel: Brug det simple når du kan. FILTER kun når problemet kræver det.

Den vigtige performance-pointe

Hvis du kan filtrere på en mindre tabel, gør det. Disse to formler er ækvivalente, men den nederste er ofte hurtigere:

Filtrer den store fakta-tabel
Audio Salg Langsom =
CALCULATE(
    COUNTROWS( Salg ),
    FILTER( Salg, RELATED( Produkter[Kategori] ) = "Audio" )
)
Filtrer den lille dimensionstabel
Audio Salg Hurtig =
CALCULATE(
    COUNTROWS( Salg ),
    FILTER( Produkter, Produkter[Kategori] = "Audio" )
)

Den nederste går gennem 80 produkter, den øverste gennem 4.000 salg. På store datasæt bliver forskellen mærkbar.

Endnu hurtigere - slet FILTER helt

Når filteret er simpelt nok, behøver du slet ikke FILTER:

Audio Salg Hurtigst =
CALCULATE(
    COUNTROWS( Salg ),
    Produkter[Kategori] = "Audio"
)
Det her er det letteste DAX kan optimere. Brug det når du kan. Spar FILTER til de komplekse tilfælde.

Øvelse - handler med rabat over 15%

CFO'en spørger: "Jeg vil se hvor mange ordrer der har fået rabat over 15% - og samtidig er over 5.000 kr i bruttoværdi."

Skriv målet selv.

Løsningsforslag
Store Rabat-handler =
CALCULATE(
    COUNTROWS( Salg ),
    FILTER(
        Salg,
        Salg[Rabat] > 0.15
            && Salg[Antal] * Salg[EnhedsPris] > 5000
    )
)

Læg mærke til at Rabat > 0,15 alene kunne være et simpelt CALCULATE-filter - men når det kombineres med multiplikationen, må vi pakke det hele ind i FILTER.

Hvad du har lært

  • FILTER lader dig udtrykke komplekse betingelser der ikke kan skrives som simple CALCULATE-filtre.
  • Foretræk simple filtre når du kan - FILTER er kraftigere, men langsommere.
  • Hvis du skal bruge FILTER, så filtrer den mindste tabel der dækker behovet.

Næste - og sidste - funktion: CFO'en vil have en grøn/rød indikator.