CALCULATE
Ajoute, supprime et modifie le contexte de filtre.
https://www.sqlbi.com/articles/filter-arguments-in-calculate/
CALCULATE (
<expression>,
<filter1>,
...
<filterN>
)<filter> peut être :
- une valeur logique (= qui renvoi Vrai ou Faux)
- une expression de table, qui supprime les filtres déjà appliqués sur les colonnes retournées par l’expression de table.
Sales2007=
CALCULATE (
SUM ( Sales[Sales Amount] ),
OrderDate[Year] = 2007
)CALCULATEréalise 4 actions :
- Supprime le filtre appliqué sur la colonne Year de la table OrderDate.
- Conserve tous les autres filtres qui seraient appliqués (sur la table Sales ou la table OrderDate ou toutes les autres tables qui filtreraient la mesure)
- Filtre la table OrderDate quand la colonne Year = 2007
- Somme la colonne SalesAmount
Ce qui donne :
Résultat de CALCULATE
| Year | Sales2007 |
| 2005 | 600 |
| 2006 | 600 |
| 2007 | 600 |
https://www.sqlbi.com/blog/marco/2010/01/03/how-calculate-works-in-dax/
/!\ CALCULATE résout l’argument 2 avant de l’appliquer au 1, contrairement aux autres fonctions)
Avec FILTER, ALL et VALUES
| Column 1 | Column 2 |
| <div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span>CALCULATE(</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> COUNTROWS(Sales),</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> FILTER( ALL('Product'[Color]), 'Product'[Color] = "Black" ) )</span></div> | Ignore/remplace les filtres de couleur existants Définit un filtre sur Noir. La ligne White affiche la valeur de Noir. |
| <div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span>CALCULATE(</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> COUNTROWS(Sales),</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> FILTER( VALUES('Product'[Color]), 'Product'[Color]= "Black" ) )</span></div> | Conserve les filtres de couleur existants Ajoute un filtre supplémentaire sur le Noir. Seule la valeur pour la ligne Noir est affichée, les autres lignes n’affichent aucune valeur. |
| <div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span>CALCULATE(</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> COUNTROWS(Sales),</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> FILTER( ALL('Product'[Color]),</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> 'Product'[Color] = “Black” ),</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> VALUES('Product'[Color]) )</span></div> | Identique à l’expression précédente (conserve les filtres de couleur existants) REMARQUE : le premier filtre prendrait en compte toutes les couleurs, mais la seconde expression (VALUES) ne considère que la sélection actuelle et les deux filtres seront considérés à l’aide d’une condition ET. |
| <div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span>= CALCULATE(</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> COUNTROWS(Sales),</span></div><div style="text-align: left; margin-top: 0.5em; margin-bottom: 0.5em;"><span> FILTER( ALL(Sales), 'Product'[Color] = "Black" ) )</span></div> | Ignore/remplace les filtres sur toutes les colonnes de la table Sales, Définit un filtre sur toutes les colonnes (Nom, Transport, etc., pas seulement Couleur) Avec des lignes qui remplissent la condition. |
CALCULATE imbriquées
externes > internes.
CALCULATE (
CALCULATE (
[Measure],
ALL ( Customer[Country] )
),
KEEPFILTERS ( Customer[Country] = "Italy" )
)C’est d’abord le CALCULATE externe (qui contient KEEPFILTERS ( Customer[Country] = "Italy" ) qui est d’abord exécuté).
Sinon dans les autres fonctions de filtre DAX : internes > externes .