Power BI
Power BI Desktop és l'eina de Business Intelligence de Microsoft. Inclou un motor de model de dades relacional, el llenguatge DAX per a mesures calculades i un entorn de disseny de dashboards interactius amb publicació a la nube.
Per què Power BI
Power BI és, el 2026, l'eina de BI més implantada a les empreses espanyoles, especialment en entorns que ja treballen amb Microsoft 365. Les seves peces principals son:
- Power BI Desktop: aplicació gratuïta per a Windows on es construeix el model de dades i el disseny dels informes.
- Power BI Service: plataforma cloud per publicar, compartir i programar l'actualització de dades.
- Power BI Mobile: aplicació per consultar dashboards des d'iOS i Android.
- Power Query: el motor d'ETL integrat, basat en el llenguatge M, que neteja i transforma les dades abans de carregar-les al model.
Quan triar Power BI
Power BI és la millor opció quan l'organització ja treballa amb l'ecosistema Microsoft (Excel, SharePoint, Azure) i necessita una eina robusta de modelatge amb DAX. Per a prototipat ràpid sobre bases de dades pròpies sense llicència, Metabase (vegeu la pàgina següent) és una alternativa més àgil.
El motor VertiPaq i el model de dades
Power BI emmagatzema les dades en un motor columnar en memòria anomenat VertiPaq, que comprimeix i indexa automàticament cada columna. Això té una conseqüència directa per al disseny: el model de dades importa més que el maquinari. Un model ben dissenyat (Star Schema, tipus de dades correctes, columnes redundants eliminades) pot ser ordres de magnitud més ràpid que un model desnormalitzat amb el mateix volum de dades.
Relacions
Les taules es connecten mitjançant relacions definides per camps comuns. Power BI suporta:
- 1:N (un a molts): la més habitual en un Star Schema. Una fila de la taula de dimensió (per exemple,
productes) es relaciona amb moltes files de la taula de fets (vendes). - N:N (molts a molts): requereix normalment una taula pont intermèdia per evitar ambigüitats de filtrat.
- 1:1 (un a un): poc freqüent, sol indicar que les dues taules es podrien fusionar.
Direcció del filtre (cross-filter direction)
Per defecte, les relacions 1:N filtren en una sola direcció: de la dimensió cap als fets. Activar el filtrat en ambdues direccions (Both) pot generar ambigüitats de càlcul en models amb diverses taules de fets. Manté-ho en Single tret que tinguis una raó concreta per canviar-ho.
Star Schema
El disseny recomanat és un esquema en estrella: una taula de fets central (vendes) envoltada de taules de dimensió (productes, clients, venedors, dates), totes relacionades 1:N amb la taula de fets.
erDiagram
VENDES }o--|| PRODUCTES : "ID_Producte"
VENDES }o--|| CLIENTS : "ID_Client"
VENDES }o--|| VENEDORS : "ID_Venedor"
VENDES }o--|| DATES : "Data"
No connectis dimensions entre si
En un Star Schema correcte, les taules de dimensió mai es relacionen directament entre elles: totes les relacions passen per la taula de fets. Relacionar productes amb clients directament trenca el model i pot produir mesures incorrectes sense que Power BI mostri cap error visible.
La taula de dates
Les funcions d'intel·ligència temporal de DAX (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) necessiten una taula de dates explícita, contínua (sense buits) i marcada com a "taula de dates" al model. Es pot generar amb Power Query:
// Power Query (M): taula de dates contínua
let
DataInici = #date(2024, 1, 1),
DataFi = #date(2026, 12, 31),
NombreDies = Duration.Days(DataFi - DataInici) + 1,
Dates = List.Dates(DataInici, NombreDies, #duration(1, 0, 0, 0)),
TaulaBase = Table.FromList(Dates, Splitter.SplitByNothing(), {"Data"}),
AmbAny = Table.AddColumn(TaulaBase, "Any", each Date.Year([Data])),
AmbMes = Table.AddColumn(AmbAny, "NomMes", each Date.ToText([Data], "MMMM", "ca-ES")),
AmbTrimestre = Table.AddColumn(AmbMes, "Trimestre", each "T" & Text.From(Date.QuarterOfYear([Data])))
in
AmbTrimestre
DAX bàsic
DAX (Data Analysis Expressions) és el llenguatge de fórmules de Power BI. S'assembla sintàcticament a Excel, però treballa sobre taules senceres i contextos de filtre, no sobre cel·les individuals.
-- Suma total de vendes
Total Vendes = SUM(vendes[import_net])
-- Nombre de comandes úniques
Num Comandes = DISTINCTCOUNT(vendes[id_venda])
-- Tiquet mig (DIVIDE evita l'error de divisió per zero)
Tiquet Mig = DIVIDE([Total Vendes], [Num Comandes], 0)
-- Marge percentual
Marge Pct = DIVIDE([Marge Brut], [Total Vendes], 0)
DIVIDE en lloc de l'operador /
DIVIDE(numerador, denominador, valor_alternatiu) és preferible a l'operador / perquè evita errors DIV/0! quan el denominador és zero o buit, retornant el tercer paràmetre (o BLANK() si s'omet) en aquest cas.
Columna calculada vs. mesura
Una columna calculada s'avalua fila a fila en el moment de carregar les dades i ocupa espai al model (s'emmagatzema). Una mesura s'avalua dinàmicament en el moment de la consulta, segons el context de filtre actiu (els filtres, segmentacions i files/columnes del visual). Com a regla general: si el càlcul depèn d'una agregació (sumar, comptar, mitjana), ha de ser una mesura; si és un atribut fix de la fila (per exemple, categoritzar un preu en "Barat/Car"), pot ser una columna calculada.
DAX avançat: CALCULATE, FILTER, ALL, RELATED
La funció CALCULATE és el cor de DAX: avalua una expressió modificant el context de filtre en què s'executa. La majoria de càlculs avançats es construeixen al voltant d'ella.
-- Vendes filtrades a una categoria concreta, ignorant el filtre de pàgina
Vendes Electronica =
CALCULATE(
[Total Vendes],
productes[categoria] = "Electrònica"
)
-- Vendes de l'any anterior (mateix període)
Vendes Any Anterior =
CALCULATE(
[Total Vendes],
SAMEPERIODLASTYEAR(dates[Data])
)
-- Creixement interanual
Creixement YoY =
VAR Actual = [Total Vendes]
VAR Anterior = [Vendes Any Anterior]
RETURN
DIVIDE(Actual - Anterior, Anterior, BLANK())
-- Vendes acumulades des de l'inici de l'any (YTD)
Vendes YTD = TOTALYTD([Total Vendes], dates[Data])
CALCULATE accepta com a arguments addicionals tant filtres simples (taula[columna] = valor) com funcions de modificació de filtre:
FILTER(taula, condició): retorna una taula filtrada fila a fila. S'usa dins deCALCULATEquan la condició és massa complexa per a la sintaxi simple de filtre booleà.ALL(taula o columna): elimina tots els filtres aplicats sobre la taula o columna indicada. Útil per calcular percentatges sobre el total sense que el context de filtre actual el redueixi.RELATED(taula[columna]): accedeix a una columna d'una taula relacionada des del costat "molts" d'una relació 1:N. Equivalent a unJOINimplícit.ALLSELECTED: similar aALL, però respecta els filtres explícits de segmentacions externes (slicers), eliminant només els filtres del propi visual.
-- Percentatge sobre el total, ignorant el filtre de categoria
Pct Total Vendes =
DIVIDE(
[Total Vendes],
CALCULATE([Total Vendes], ALL(productes[categoria])),
0
)
-- Cost unitari obtingut de la taula de productes relacionada
Cost Linia = vendes[quantitat] * RELATED(productes[cost_unitari])
-- Rang de producte per vendes dins del context seleccionat
Rang Producte =
RANKX(
ALLSELECTED(productes[nom_producte]),
[Total Vendes],
,
DESC,
DENSE
)
-- Vendes amb un filtre complex via FILTER
Vendes Clients Premium =
CALCULATE(
[Total Vendes],
FILTER(clients, clients[segment] = "Premium" && clients[actiu] = TRUE)
)
Context de fila vs. context de filtre
Entendre DAX en profunditat requereix distingir el context de fila (en quina fila s'està avaluant l'expressió, rellevant en columnes calculades i funcions iteradores com SUMX) del context de filtre (quins filtres estan actius quan s'avalua una mesura). CALCULATE és l'única funció que pot transformar un context de fila en context de filtre, mitjançant l'anomenada transició de context.
Disseny de dashboards
Un dashboard professional combina KPIs, gràfics i taules en una graella coherent. Algunes pràctiques recomanades:
- Jerarquia visual: els KPIs més importants a la part superior esquerra, on l'ull de l'usuari mira primer.
- Consistència de colors: assigna sempre el mateix color a la mateixa mètrica entre visualitzacions (per exemple, ingressos sempre en blau).
- Títols descriptius: "Ingressos mensuals 2026 vs. 2025" comunica més que "Ingressos".
- Slicers (segmentacions): filtres interactius (any, categoria, zona) que l'usuari pot manipular sense tocar el model.
- Sincronització de slicers: a Visualització → Sincronitza segmentacions, es pot fer que un mateix slicer afecti diverses pàgines del dashboard alhora.
// Exemple de mesura formatada per a una targeta KPI
Ingressos Formatats = FORMAT([Total Vendes], "#,##0 €")
Tècniques de disseny en profunditat
Aquest apartat és només un resum. La pàgina Tècniques de disseny de dashboards desenvolupa en profunditat els tipus de dashboard, la jerarquia visual i els patrons de lectura, la graella i l'agrupació, el disseny de targetes KPI, el color a nivell de dashboard, els anti-patrons habituals, una checklist abans de publicar i webgrafia de referència (Stephen Few, Cole Nussbaumer Knaflic, Tufte, galeries de dashboards reals).
Interactivitat avançada
Bookmarks (marcadors)
Els bookmarks capturen l'estat exacte d'una pàgina: els filtres aplicats, la visibilitat dels objectes i fins i tot el zoom. Combinats amb botons, permeten simular navegació entre "vistes" diferents dins d'una mateixa pàgina (per exemple, alternar entre una vista de "Resum" i una vista de "Detall" sense canviar de pestanya).
Per crear-los: Visualització → Marcadors → Afegeix, després d'ajustar l'estat desitjat de la pàgina. Es poden agrupar en una pila de botons per construir un mini-menú de navegació.
Drill-through
El drill-through permet saltar des d'un visual de resum a una pàgina de detall filtrada automàticament pel valor seleccionat (per exemple, fer clic dret sobre un client en un gràfic de barres i accedir a una pàgina amb totes les seves comandes). Es configura marcant una pàgina com a destinació de drill-through i afegint-hi el camp pel qual ha de filtrar-se (Camps de drill-through al panell de format).
Tooltip pages (pàgines d'eina emergent)
Una tooltip page és una pàgina en miniatura (normalment 320×240 px) que es mostra com a tooltip emergent quan l'usuari passa el cursor sobre un punt d'un gràfic, en lloc del tooltip per defecte. Permet mostrar un mini-dashboard contextual (per exemple, l'evolució mensual d'una categoria concreta) sense saturar el visual principal. Es configura marcant la pàgina com a "Pàgina d'eina emergent" a les propietats i assignant-la des del format del visual (Format → Tooltips → Tipus: Informe).
flowchart LR
A["Visual de resum\n(gràfic de barres)"] -->|"Clic dret > Mostra detalls"| B["Pàgina de drill-through\n(filtrada per la selecció)"]
A -->|"Hover"| C["Tooltip page\n(mini-dashboard contextual)"]
D["Botó de navegació"] -->|"Bookmark"| E["Estat alternatiu\nde la mateixa pàgina"]
Activitat AC5074/07/03 — Informe bàsic
Connecta Power BI Desktop a un fitxer CSV propi (o el del Bloc 2) i crea un informe amb almenys quatre visualitzacions: un KPI, un gràfic temporal, un gràfic de comparació per categoria i una taula. Aplica almenys dues mesures DAX bàsiques (SUM, DIVIDE).
Aquests conceptes s'apliquen de manera integrada a la pràctica avaluable PR507407 — Dashboard Power BI, que demana un model complet, mesures DAX avançades i interactivitat amb bookmarks i drill-through.