Abans d'obrir un visual, cal tenir clar que un informe de Power BI passa sempre per tres fases connectades: importar i transformar les dades, modelar les taules i relacions, i visualitzar. Un informe no es basa en gràfics bonics: es basa en una base de dades neta, ben estructurada i correctament modelada.
de dades
neteja i transforma
taules i relacions
l'informe final
Power Query és l'entorn de preparació de dades de Power BI. Aquí es netegen, transformen i estructuren les dades abans de carregar-les al model.
Quan fer cada transformació:
| Acció | Quan fer-ho |
|---|---|
| Renombrar columnes | Al final de tot |
| Eliminar columnes | Només si tens la certesa que no les necessitaràs |
| Reordenar columnes | Millor evitar-ho: no aporta valor al model i trenca passos posteriors |
| Canviar tipus de dades | En un sol pas, al final (evita errors en cascada) |
| Combinar consultes (merge) | Sempre que calgui enriquir dades des d'una altra taula |
| Afegir columnes personalitzades | Només si necessites camps derivats nous |
- Usa noms clars i sense espais:
DataVendamillor que "data venda" - Evita caràcters especials o accents en noms de columna i de taula
- Renombra els passos si cal claredat (clic dret sobre el pas → "Canviar el nom")
L'esquema en estrella és l'estructura de model optimitzada per a l'anàlisi. Es compon de taules de fets (dades numèriques: vendes, imports, quantitats) i taules de dimensions (dades descriptives que filtren i agrupen: clients, productes, dates, zones).
📊 Taules de fets
Contenen les mètriques. Creixen molt (milions de files). Mai s'hi relaciona directament una altra taula de fets.
🏷️ Taules de dimensió
Contenen descripcions. Han de tenir clau única per fila per poder crear relacions correctes.
Per què val la pena l'esforç:
- Millora el rendiment de Power BI
- Facilita escriure mesures DAX sense ambigüitats
- Redueix errors en relacions
- Permet relacions d'un a molts, predictibles i eficients
Regles bàsiques:
- Les dimensions tenen camps únics (sense repetir) per poder relacionar-se correctament
- Les relacions van sempre de dimensió → fets (un a molts)
- Evita les relacions de molts a molts sempre que puguis
- Mai relacionis dues taules de fets directament; usa una dimensió comuna o una taula intermèdia
Power BI necessita una taula de dates pròpia per crear mesures d'intel·ligència temporal (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) i per filtrar de forma consistent per any, mes o trimestre.
Desactiva-ho primer:
Crea-la manualment amb DAX:
Calendari =
ADDCOLUMNS(
CALENDAR(DATE(2015,1,1), DATE(2030,12,31)),
"Any", YEAR([Date]),
"Mes", MONTH([Date]),
"NomMes", FORMAT([Date], "MMMM"),
"Trimestre", "Q" & FORMAT([Date], "Q"),
"AnyMes", FORMAT([Date], "YYYY-MM")
)
- El camp
[Date]ha de ser únic i sense buits en el rang - Ordena
NomMesperMes, iAnyMesper[Date]
Versió dinàmica (recomanada per a producció): calcula l'inici i el final a partir de les dates reals de la taula de fets, arrodonits a any complet perquè les comparatives YTD i interanuals no es trenquin a mig any.
Calendari =
VAR DataMin = DATE( YEAR( MIN( F_Vendes[Data] ) ), 1, 1 )
VAR DataMax = DATE( YEAR( MAX( F_Vendes[Data] ) ), 12, 31 )
RETURN
ADDCOLUMNS(
CALENDAR( DataMin, DataMax ),
"Any", YEAR([Date]),
"Mes", MONTH([Date]),
"NomMes", FORMAT([Date], "MMMM"),
"Trimestre", "Q" & FORMAT([Date], "Q"),
"AnyMes", FORMAT([Date], "YYYY-MM")
)
MIN i MAX no treballen amb context de fila: agreguen tota la columna de la taula de fets d'un sol cop, com ho faria una mesura. I com que Calendari és una taula calculada en DAX (no una consulta de Power Query), es torna a calcular sencera cada vegada que refresques el model. Per això la data final sempre reflecteix l'última venda carregada, sense tocar el codi.[Data] a la taula de fets és Datetime amb hora, no cal truncar-la a part: com que aquí reconstruïm la data amb DATE(YEAR(...),1,1) i DATE(YEAR(...),12,31), la part d'hora queda descartada automàticament. Si tens més d'una taula de fets amb dates (vendes, compres…), amplia el MIN/MAX perquè cobreixi totes: MIN( MIN(F_Vendes[Data]), MIN(F_Compres[Data]) ).List.Min / List.Max sobre la columna de dates + List.Dates()).
I marca-la com a taula de dates (per a qualsevol de les dues versions):
[Date]
Amb les dades importades i el model estructurat, toca deixar-lo net i clar tant per a l'usuari final com per a tu mateix quan hi tornis d'aquí sis mesos.
Categoritza i formata cada camp:
| Camp | Tipus de dada | Format | Categoria de dades |
|---|---|---|---|
| Import | Decimal | Moneda (€) | Cap |
| Ciutat | Text | — | Ciutat |
| Pàgina web | Text | — | URL |
| ImatgeURL | Text | — | Imatge |
- Ordena columnes com
NomMesper una auxiliar numèrica (Modelatge → "Ordenar per columna") - Oculta columnes tècniques, d'ordenació o claus redundants (
IDProductesi ja tensNomProducte) — clic dret → "Ocultar a la vista d'informe" - Fes servir noms coherents per a taules i columnes; els prefixos
DIM_/F_són opcionals però ajuden a distingir dimensions de fets d'un cop d'ull
Abans de passar a la visualització, valida:
- Totes les relacions estan actives
- No hi ha relacions innecessàries
- Totes van d'1 (dimensió) a * (fets)
Amb dades i model llestos, arriba la fase visual. L'objectiu és mostrar la informació de forma clara i útil per prendre decisions — no fer una demostració de tots els visuals que ofereix Power BI.
Planifica abans de dissenyar:
- Pregunta't: què necessita veure l'usuari final, concretament?
- Defineix els KPI clau, els filtres habituals i les agrupacions per període
- Organitza per pàgines: una de resum (dashboard general) i altres de detall (per producte, client, zona…)
Tipus de filtres i quan usar-los:
| Tipus de filtre | Ús recomanat |
|---|---|
| Segmentadors (slicers) | Filtres visibles per a data, categoria, client… |
| Filtres de pàgina | S'apliquen a tots els visuals d'una pàgina |
| Filtres d'informe | S'apliquen a totes les pàgines de l'informe |
| Filtres de visual | Afecten només un gràfic concret |
| Drillthrough | Passa a una pàgina de detall filtrada per l'element on has fet clic (no surt al PDF original, i és clau per a informes de detall sense saturar la pàgina de resum) |
Disposició clara:
- Evita sobrecarregar la pàgina amb massa visuals
- Deixa espais en blanc: milloren la llegibilitat
- Usa una paleta de colors coherent en tot l'informe
- Alinea els visuals i posa'ls títols clars
- Prioritza elements simples: targetes, columnes/línies, taules
Mesures DAX, no columnes calculades:
Ocupa espai en memòria per a cada fila. Es recalcula en carregar i no respecta el context de filtre dinàmicament.
TotalVendes = SUM(F_Vendes[Import]) VendesYTD = TOTALYTD([TotalVendes], Calendari[Date])
Interaccions i format:
- Decideix com interactuen els visuals entre ells (filtren / ressalten / no s'afecten) des de Format → "Editar interaccions"
- Personalitza colors, etiquetes, línies de referència, mides de text i marges per a cada visual
Tooltips personalitzats:
Abans d'entregar l'informe, revisa'l com si fossis l'usuari final: filtra per diferents valors, comprova que els visuals responen bé, i assegura't que les dades s'entenen sense haver-te de preguntar res a tu.
- Noms clars, consistents i sense espais
- Canvis de tipus, nom i ordre fets al final del procés a Power Query
- Auto date/time desactivat i taula de calendari pròpia
- Columnes innecessàries ocultes a l'informe
- Model en estrella (fets + dimensions)
- Camps formatats i categoritzats correctament
- Mesures DAX en lloc de columnes calculades quan és possible
- Informe enfocat, sense excés de gràfics
- Visuals alineats i ben etiquetats
- Navegació i filtres provats com a usuari final
- Relacions de molts a molts innecessàries
- Relacionar dues taules de fets directament
- Deixar actives les taules de dates automàtiques
- Carregar columnes que mai s'usen
- No ordenar "Mes" o "NomMes" per la columna numèrica corresponent
- No marcar la taula de dates com a tal
- Escriure mesures sense entendre el context de filtratge
- Fer massa transformacions al principi de Power Query (trenca el query folding)
- No netejar les dades abans de visualitzar-les
- Confiar cegament en relacions autodetectades
Uns quants ajustos que val la pena revisar en començar qualsevol projecte, per evitar problemes que després costen molt de desfer.
📅 Auto date/time
Fitxer → Opcions → Càrrega de dades → desactiva "Auto date/time per a nous fitxers". Evita que Power BI generi una taula de dates interna per cada camp de tipus data.
🌍 Regionalització
Fitxer → Opcions → Configuració regional. Assegura't que l'arxiu usa la configuració correcta (p. ex. "Català" o l'idioma predeterminat de Windows): afecta format de dates, separadors decimals i moneda.
⚡ Rendiment
Opcions → Càrrega de dades → vista prèvia de dades: desactiva el càlcul automàtic de previsualitzacions si treballes amb volums grans. Millora el rendiment editant a Power Query.
🧹 Versió neta
Abans de compartir: elimina consultes no utilitzades, neteja taules/columnes/mesures de prova, i comprova que el model final estigui optimitzat.
És la part que sempre s'obvia i la que més es troba a faltar sis mesos després. Documentar bé el model ajuda a entendre el flux de treball, facilita el manteniment, permet col·laborar amb altres equips i fa que sigui més fàcil detectar errors o colls d'ampolla en la lògica de negoci.
- Usa noms descriptius i coherents per a taules, columnes i mesures
- Afegeix comentaris als passos de Power Query (clic dret sobre el pas → "Propietats" → escriu un comentari)
- Fes servir una taula auxiliar o un document extern on expliquis l'estructura del model, les relacions entre taules, les regles de negoci (com es calculen els KPI) i les suposicions preses (p. ex. "els valors nuls es tracten com a 0")
- Anomena les mesures DAX seguint un patró clar (p. ex. Total Vendes, Mitjana Vendes Últims 3 Mesos)
- Afegeix descripcions als camps (clic al camp → panell de propietats → "Descripció")
Apliquem els nou capítols anteriors seguits, sobre un cas real petit: una botiga d'articles esportius amb vendes, clients i productes. L'objectiu no és el resultat final, és veure com cada decisió d'un capítol condiciona el següent.
10.1 · Les dades en brut
Així arriba l'extracció del sistema de vendes, sense tocar:
| fecha venta | cliente | PRODUCTO | qty | import € |
|---|---|---|---|---|
| 03/01/2024 | Marta Solé | Bicicleta Trek FX2 | 1 | 649,00 |
| 2024-01-04 | joan puig | casc mtb pro | 2 | 89,90 |
| 5/1/2024 | MARTA SOLÉ | Bicicleta Trek FX2 | 1 | 649,00 |
10.2 · Neteja a Power Query
fecha venta forçant el format d'origen (Regió: Espanya/dia-mes) abans que Power Query l'endevini malament amb el pas automàtic de "Tipus canviat"cliente: Text.Trim + Text.Proper (treu espais i uniformitza majúscules/minúscules) perquè "Marta Solé" i "MARTA SOLÉ " es tractin com el mateix clientDataVenda/Client/Producte/Quantitat/Import i fixa els tipus definitius en un sol pas10.3 · Model en estrella
F_Vendes conté DataVenda, IdClient, IdProducte, Quantitat i Import — res de nom de client ni de producte, això viu a les dimensions. Les tres relacions surten de F_Vendes cap a cada dimensió, totes 1 (dimensió) a * (fets), com marca el capítol 3.
10.4 · Calendari dinàmic aplicat al cas
Calendari = VAR DataMin = DATE( YEAR( MIN( F_Vendes[DataVenda] ) ), 1, 1 ) VAR DataMax = DATE( YEAR( MAX( F_Vendes[DataVenda] ) ), 12, 31 ) RETURN ADDCOLUMNS( CALENDAR( DataMin, DataMax ), "Any", YEAR([Date]), "Mes", MONTH([Date]), "NomMes", FORMAT([Date],"MMMM") )
Cada cop que es carreguen vendes noves, DataMax avança sol. Ningú ha de recordar "ampliar el calendari" el gener següent.
10.5 · Mesures clau
TotalVendes = SUM(F_Vendes[Import]) CostVendes = SUMX(F_Vendes, F_Vendes[Quantitat] * RELATED(DIM_Productes[CostUnitari])) MargeBrut = [TotalVendes] - [CostVendes] MargePercent = DIVIDE([MargeBrut], [TotalVendes]) VendesYTD = TOTALYTD([TotalVendes], Calendari[Date]) VendesAnyAnterior = CALCULATE([TotalVendes], SAMEPERIODLASTYEAR(Calendari[Date]))
SUMXés necessari aCostVendesperquè el cost és per unitat: cal multiplicar fila a fila abans de sumar, no es pot fer amb unSUMdirecteRELATEDllegeix el cost des de la dimensióDIM_Productesaprofitant el context de fila que donaSUMXsobreF_VendesDIVIDEen lloc de/: retorna en blanc (o el tercer paràmetre, si l'indiques) quanTotalVendesés 0, sense trencar el visual amb un error de divisió
10.6 · Disseny de l'informe
📄 Pàgina 1 · Resum
Targetes amb TotalVendes, MargePercent i VendesYTD. Gràfic de columnes de vendes per mes. Segmentador d'any. Cap taula detallada: és la pàgina que obre un directiu.
📄 Pàgina 2 · Detall per client
Taula amb clients i les seves mètriques. S'hi arriba per drillthrough des d'una barra de la pàgina 1 (capítol 6.3). Segmentador de categoria de producte.
El cicle real d'un informe ben construït
L'ordre dels capítols és l'ordre en què s'han de prendre les decisions. Saltar-se'l és el que produeix informes que "funcionen" fins que algú els vol ampliar. El capítol 10 mostra el mateix ordre aplicat a un cas real.
Un informe correcte avui i un informe mantenible d'aquí un any no són el mateix objectiu. Aquesta guia apunta al segon.