After years working across Swiss 4 and 5-star hotels — from front office to revenue management — I've built a lot of Power BI dashboards. The same questions come up every time: What's our occupancy tonight? How are we tracking against last year? Where is RevPAR leaking?
Après des années de travail dans des hôtels suisses 4 et 5 étoiles — de la réception au revenue management — j'ai construit beaucoup de tableaux de bord Power BI. Les mêmes questions reviennent à chaque fois : quel est notre taux d'occupation ce soir ? Comment nous situons-nous par rapport à l'année dernière ? Où le RevPAR se dégrade-t-il ?
These five DAX patterns answer exactly those questions. They're the ones I reach for on every hospitality project.
Ces cinq modèles DAX répondent exactement à ces questions. Ce sont ceux auxquels je fais appel sur chaque projet hôtelier.
1. Occupancy Rate
1. Taux d'occupation
This is the foundation of every hotel dashboard. Occupancy is simply rooms sold divided by rooms available — but in DAX you need to handle dates carefully to avoid dividing by zero on days with no availability.
C'est la base de chaque tableau de bord hôtelier. Le taux d'occupation est simplement les chambres vendues divisées par les chambres disponibles — mais en DAX il faut gérer les dates avec soin pour éviter de diviser par zéro les jours sans disponibilité.
2. Year-over-Year Revenue Comparison
2. Comparaison des revenus d'une année sur l'autre
YoY comparisons are the most-requested metric in every hotel boardroom. Use SAMEPERIODLASTYEAR wrapped in CALCULATE to shift context cleanly.
Les comparaisons annuelles sont les métriques les plus demandées dans chaque salle de direction d'hôtel. Utilisez SAMEPERIODLASTYEAR encapsulé dans CALCULATE pour déplacer le contexte proprement.
3. RevPAR (Revenue Per Available Room)
3. RevPAR (Revenu par chambre disponible)
RevPAR is the single most important KPI in hotel revenue management. It combines both occupancy and rate into one number, making it ideal for tracking overall performance.
Le RevPAR est le KPI le plus important du revenue management hôtelier. Il combine taux d'occupation et tarif en un seul chiffre, ce qui le rend idéal pour suivre la performance globale.
The difference from ADR (Average Daily Rate) is subtle but important: RevPAR penalises empty rooms, ADR does not. Always show both side by side.
La différence avec l'ADR (Average Daily Rate) est subtile mais importante : le RevPAR pénalise les chambres vides, l'ADR ne le fait pas. Affichez toujours les deux côte à côte.
4. Lead Time Analysis
4. Analyse du lead time
Knowing how far in advance guests book is critical for pricing strategy. A 2-night leisure booking made 90 days out is very different from a same-day walk-in. This measure calculates average lead time dynamically based on your slicer selection.
Savoir à quelle avance les clients réservent est essentiel pour la stratégie tarifaire. Une réservation de 2 nuits loisirs faite 90 jours à l'avance est très différente d'un walk-in le jour même. Cette mesure calcule le lead time moyen dynamiquement selon votre sélection de filtre.
5. Running Total with Period Reset
5. Total cumulé avec remise à zéro de période
Monthly running totals are essential for tracking pace against budget. The trick is resetting at the start of each month — a common pitfall for analysts new to DAX.
Les totaux cumulés mensuels sont essentiels pour suivre le pace par rapport au budget. L'astuce est la remise à zéro au début de chaque mois — un écueil fréquent pour les analystes novices en DAX.
Putting it together
Tout assembler
These five patterns cover roughly 80% of the analytical questions I get from hotel operations teams. Build them as reusable measures in a dedicated _Measures table, and you'll have a solid foundation for any hospitality dashboard.
Ces cinq modèles couvrent environ 80 % des questions analytiques que je reçois des équipes d'exploitation hôtelière. Construisez-les comme des mesures réutilisables dans une table _Measures dédiée, et vous aurez une base solide pour tout tableau de bord hôtelier.
In a future post I'll cover dynamic benchmarking — comparing individual properties against a portfolio average using ALL() and REMOVEFILTERS().
Dans un prochain article, je couvrirai le benchmarking dynamique — comparer des établissements individuels à une moyenne de portefeuille en utilisant ALL() et REMOVEFILTERS().