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

Modul 8 - Over eller under budget

Grøn/rød indikator efter om vi rammer budgettet. IF er svaret, og SWITCH er forbedringen.

Fredag morgen. Sidste sten i puslespillet.

"Når jeg viser omsætningen pr. kategori, vil jeg have en lille markør. Grøn hvis vi er over budget, rød hvis vi er under. Bare som tekst - 'Over' eller 'Under'."

Du tænker: "Nu er vi tilbage i Excel-land. IF-formel."

Du har faktisk ret. IF i DAX er stort set det samme som IF i Excel - den vurderer en betingelse og returnerer én ting hvis sand, noget andet hvis falsk.

IF - betinget logik

Syntaks

IF(
    <betingelse>,
    <værdi hvis sand>,
    <værdi hvis falsk>
)

Stort set identisk med Excel. Den eneste forskel er at i DAX kan både betingelsen og returværdierne være målbaseret - så formlen er dynamisk og opdaterer sig pr. visual-celle.

Løsningen

Først skal du have budgettallet pr. kategori. Budgettet ligger i Produkter[MaanedsBudget] - pr. produkt. Pr. kategori bliver det summen af produkternes budgetter:

Månedsbudget pr. kategori
Månedsbudget =
SUM( Produkter[MaanedsBudget] )

Når du trækker Produkter[Kategori] ind som rækker, viser det budget pr. kategori - SUM aggregerer automatisk.

Nu kan du lave statussen:

Status mod budget
Budget Status =
IF(
    [Total Omsætning] >= [Månedsbudget],
    "Over",
    "Under"
)

Træk den ind i din kategori-tabel som en kolonne - nu står "Over" eller "Under" ved siden af hver kategoris omsætning.

Mere end to udfald - nestet IF eller SWITCH

CFO'en vil have mere nuance:

"Faktisk vil jeg gerne se tre niveauer. Hvis vi er mere end 10% over: 'Stærkt over'. Hvis vi er inden for 10% af budgettet: 'På sporet'. Ellers: 'Under'."

Du kan neste IF'er:

Tre-niveau status - med nestet IF
Budget Status 3 =
IF(
    [Total Omsætning] >= [Månedsbudget] * 1.10,
    "Stærkt over",
    IF(
        [Total Omsætning] >= [Månedsbudget] * 0.90,
        "På sporet",
        "Under"
    )
)

Det virker, men det bliver hurtigt uoverskueligt med fire-fem niveauer. Brug i stedet SWITCH med en TRUE()-konstruktion:

Tre-niveau status - med SWITCH
Budget Status 3 =
SWITCH(
    TRUE(),
    [Total Omsætning] >= [Månedsbudget] * 1.10, "Stærkt over",
    [Total Omsætning] >= [Månedsbudget] * 0.90, "På sporet",
    "Under"
)

SWITCH er ikke en af de fem funktioner i kursets kerne, men det er den pænere måde at skrive nestede IF'er. Lær den - du kommer til at bruge den.

IF kombineret med tomme/manglende værdier

En klassisk fælde: dit visual har en kategori uden salg i september. Total Omsætning returnerer BLANK (ikke 0). Hvad sker der med din IF?

IF( BLANK() >= [Månedsbudget], "Over", "Under" )

DAX behandler BLANK som 0 i sammenligninger, så det returnerer "Under". Det er normalt det du vil - men nogle gange vil du eksplicit håndtere det:

Sikker version
Budget Status Sikker =
IF(
    ISBLANK( [Total Omsætning] ),
    "Ingen salg",
    IF( [Total Omsætning] >= [Månedsbudget], "Over", "Under" )
)

Brug IF i betinget formatering

Tekst-statussen er fint, men CFO'en vil i virkeligheden have grøn/rød farve på selve omsætningstallet. Det gør du ikke med IF i selve målet - du gør det via Power BI's betingede formatering:

  1. Klik på dit visual, find Total Omsætning i værdier.
  2. Klik på pil ned → Betinget formatering → Skriftfarve.
  3. Vælg Formater efter: Feltværdi.
  4. Lav et nyt mål:
Farve til betinget formatering
Status Farve =
IF( [Total Omsætning] >= [Månedsbudget], "#2E7D32", "#C62828" )

Vælg det som feltværdi for farven. Nu skifter tallets farve dynamisk efter status. Det er Power BI-trickset CFO'en faktisk ville have.

Øvelse - performance-flag på handler

Lav en beregnet kolonne på Salg der hedder Handelsstørrelse og som returnerer:

  • "Stor" hvis linjeomsætning over 10.000
  • "Mellem" hvis mellem 2.000 og 10.000
  • "Lille" ellers
Løsningsforslag
Handelsstørrelse =
VAR LinjeOms = Salg[Antal] * Salg[EnhedsPris] * ( 1 - Salg[Rabat] )
RETURN
SWITCH(
    TRUE(),
    LinjeOms > 10000, "Stor",
    LinjeOms >= 2000, "Mellem",
    "Lille"
)

Her bruger jeg VAR til at gemme linjeomsætningen - så slipper jeg for at gentage formlen tre gange. Det er den slags oprydning modul 9 viser dig.

Hvad du har lært

  • IF virker som i Excel - betingelse, sand, falsk.
  • For flere udfald: brug SWITCH med TRUE() i stedet for nestede IF'er.
  • Husk at BLANK opfører sig som 0 i sammenligninger - eksplicit håndtering med ISBLANK hvis du har brug for det.
  • Til farve-formatering: lav et separat mål der returnerer hex-koder, og brug det i betinget formatering.

Du har nu set alle fem funktioner. Sidste modul samler dem i ét stort mål.