DAX: Ne használja a FILTER-t szűrő argumentumakéntDAX: Avoid using FILTER as a filter argument

Adatmodellezőként gyakran írhat olyan DAX-kifejezéseket, amelyeket egy módosított szűrőkontextusban kell kiértékelni.As a data modeler, it's common you'll write DAX expressions that need to be evaluated in a modified filter context. Írhat például egy olyan mértékdefiníciót, amely kiszámítja a magas árrésű termékek értékesítését.For example, you can write a measure definition to calculate sales for "high margin products". Ezt a számítást a cikk későbbi részében ismertetjük.We'll describe this calculation later in this article.

Megjegyzés

Ez a cikk különösen hasznos olyan számításokhoz, amelyek szűrők alkalmazásával importálnak táblázatokat.This article is especially relevant for model calculations that apply filters to Import tables.

A CALCULATE és a CALCULATETABLE DAX-függvények fontos és hasznos függvények.The CALCULATE and CALCULATETABLE DAX functions are important and useful functions. Ezekkel olyan számításokat írhat, amelyek szűrőket távolítanak el vagy adnak hozzá, vagy kapcsolati útvonalakat módosítanak.They let you write calculations that remove or add filters, or modify relationship paths. Ehhez szűrőargumentumokat ad meg, amelyek lehetnek logikai kifejezések, táblázatos kifejezések vagy speciális szűrőfüggvények.It's done by passing in filter arguments, which are either Boolean expressions, table expressions, or special filter functions. Ebben a cikkben csak a logikai és a táblázatos kifejezésekkel foglalkozunk.We'll only discuss Boolean and table expressions in this article.

Vegyük például az alábbi mértékdefiníciót, amely vörös termékek értékesítését számítja ki egy táblázatos kifejezéssel.Consider the following measure definition, which calculates red product sales by using a table expression. Ez a Product (Termék) táblára alkalmazott összes szűrőt lecseréli.It will replace any filters that might be applied to the Product table.

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

A CALCULATE függvény elfogadja a FILTER DAX-függvény által visszaadott táblázatos kifejezést, amely a Product tábla minden sorának szűrőkifejezését kiértékeli.The CALCULATE function accepts a table expression returned by the FILTER DAX function, which evaluates its filter expression for each row of the Product table. Ez kiadja a helyes eredményt – a vörös termékek értékesítési eredményét.It achieves the correct result—the sales result for red products. Azonban ez sokkal hatékonyabban is elérhető egy logikai kifejezéssel.However, it could be achieved much more efficiently by using a Boolean expression.

Itt egy továbbfejlesztett mértékdefiníciót láthat, amely táblázatos helyett logikai kifejezést használ.Here's an improved measure definition, which uses a Boolean expression instead of the table expression. A KEEPFILTERS DAX-függvény gondoskodik arról, hogy a Szín oszlopra alkalmazott meglévő szűrők megmaradjanak, és ne legyenek felülírva.The KEEPFILTERS DAX function ensures any existing filters applied to the Color column are preserved, and not overwritten.

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

Azt javasoljuk, hogy a szűrőargumentumokat logikai kifejezésként adja meg, amikor csak lehetséges.We recommend you pass filter arguments as Boolean expressions, whenever possible. Ez azért van, mert a Modell importálása táblák memórián belüli oszloptárak.It's because Import model tables are in-memory column stores. Kifejezetten oszlopok hatékony szűrésére vannak optimalizálva.They are explicitly optimized to efficiently filter columns in this way.

A szűrési argumentumként használt logikai függvényekre azonban bizonyos korlátozások vonatkoznak.There are, however, restrictions that apply to Boolean expressions when they're used as filter arguments. Ezek:They:

  • Nem hasonlíthatnak össze oszlopokat más oszlopokkalCannot compare columns to other columns
  • Nem hivatkozhatnak mértékreCannot reference a measure
  • Nem használhatnak beágyazott CALCULATE függvényeketCannot use nested CALCULATE functions
  • Nem használhatnak táblázatot vizsgáló vagy eredményező függvényeketCannot use functions that scan or return a table

Összetettebb szűrési követelményekhez tehát táblázatos kifejezéseket kell használnia.It means that you'll need to use table expressions for more complex filter requirements.

Vegyünk egy másik mértékdefiníciót.Consider now a different measure definition.

High Margin Product Sales =
CALCULATE(
    [Sales],
    FILTER(
        'Product',
        'Product'[ListPrice] > 'Product'[StandardCost] * 2
    )
)

A magas árrésű termék definíciója az olyan termék, amelynek listaára meghaladja a szabványos ár kétszeresét.The definition of a high margin product is one that has a list price exceeding double its standard cost. Ebben a példában a FILTER függvényt kell használni.In this example, the FILTER function must be used. Ez azért van, mert a szűrési kifejezés túl összetett logikai kifejezéshez.It's because the filter expression is too complex for a Boolean expression.

Íme még egy példa.Here's one more example. A követelmény ezúttal az értékesítés kiszámítása, azonban csak a profitot termelő hónapokra.The requirement this time is to calculate sales, but only for months that have achieved a profit.

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0)
    )
)

Ebben a példában is a FILTER függvényt kell használni.In this example, the FILTER function must also be used. Ennek oka az, hogy a profit mértékének kiértékelésére van szükség a profitot nem termelő hónapok kizárásához.It's because it requires evaluating the Profit measure to eliminate those months that didn't achieve a profit. Mérték nem használható logikai kifejezésben, ha szűrési argumentumként is szolgál.It's not possible to use a measure in a Boolean expression when it's used as a filter argument.

JavaslatokRecommendations

A legjobb teljesítmény érdekében azt javasoljuk, hogy logikai kifejezéseket használjon szűrési argumentumként, amikor csak lehetséges.For best performance, we recommend you use Boolean expressions as filter arguments, whenever possible.

A FILTER függvényt tehát csak akkor használja, ha szükséges.Therefore, the FILTER function should only be used when necessary. Segítségével összetett oszlop-összehasonlításokat szűrhet.You can use it to perform filter complex column comparisons. Ezek az oszlop-összehasonlítások a következőket foglalhatják magukban:These column comparisons can involve:

  • MértékekMeasures
  • További oszlopokOther columns
  • Az OR DAX-függvény vagy az OR logikai operátor (||) használataUsing the OR DAX function, or the OR logical operator (||)

Következő lépésekNext steps

Erről a cikkről a következő forrásanyagokban talál további információt:For more information about this article, check out the following resources: