Comme vous avez déjà pu le constater (ou pas encore), en DAX :
- les fonctions de manipulation de dates ne propose pas grand-chose concernant les dates ISO
- il n’est pas possible de manipuler vos hiérarchies calendaires tout comme on le fait en MDX ( lag, lead, parent, cousin, etc.)
Alors comment faire pour créer des mesures permettant d’avoir la valeur de l’année précédente en se basant sur le calendrier Iso ? C’était si simple en multidimensionnel …
- Insérez dans votre dimension Temps une colonne calculée permettant de récupérer, pour chaque date, le même jour de la semaine l’année précédente :
Calendar[Same Weekday Last Year] := DATEADD(Calendar[Date]; ROUND(52,1775 * -1;0)*7;day)
- Pour avoir la somme des ventes sur l’année précédente en utilisant le calendrier ISO, il ne reste plus qu’à filtrer le calcul sur la plage de date souhaitée, ce qui nous donne :
Sales[Sales Amount Iso LY] := CALCULATE( SUM( Sales[Sales Amount] ); FILTER( ALL( Calendar ); CONTAINS(VALUES(Calendar[Same Weekday Last Year]);Calendar[Same Weekday Last Year];Calendar[Date]) ) )
Notez au passage que je n’ai pas utilisé la fonction HASONEVALUE() et que par conséquent ma mesure calculée va pouvoir s’appliquer à n’importe quelle hiérarchie calendaire (regular, iso, etc …)
Vérification du résultat dans un Pivot Table :
Au passage, je vous recommande l’excellent article de Marco Russo sur la manipulation des Iso Weeks en DAX .
Pourquoi écrire ROUND(52,1775 * -1;0)*7 plutôt que -52*7? Est-ce le reliquat d’un calcul plus complexe – entre temps abandonné – ou bien est-ce que quelque chose m’échappe?
Salut Laurent,
Tu as raison dans notre cas cela ne sert à rien.
Il s’agit juste de la transposition bête et méchante d’un trick SQL que j’utilise assez souvent pour récupérer le même jour de la semaine sur plusieurs années :
select DATEADD(day,ROUND(52,1775 * @nbYears)*7,@date)
Et là le round à son utilité.
Merci pour ton commentaire, çà m’a permis de placer mon trick SQL 😉
Tout le plaisir est pour moi. 🙂