web-dev-qa-db-fra.com

Le FILTRE doit-il être utilisé à l'intérieur ou à l'extérieur de SUMMARIZE?

J'ai ces deux requêtes:

EVALUATE
FILTER (
    SUMMARIZE (
        'Sales',
        Products[ProductName],
        'Calendar'[CalendarYear],
        "Total Sales Amount", SUM ( Sales[SalesAmount] ),
        "Total Cost", SUM ( 'Sales'[TotalProductCost] )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

et ça:

EVALUATE
SUMMARIZE (
    FILTER ( 'Sales', RELATED ( Products[ProductName] ) = "AWC Logo Cap" ),
    Products[ProductName],
    'Calendar'[CalendarYear],
    "Total Sales Amount", SUM ( Sales[SalesAmount] ),
    "Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

Les deux renvoient les éléments suivants:

enter image description here

La seule différence entre les deux requêtes est le positionnement de la fonction FILTER - quelle est la meilleure pratique et pourquoi?


remarque

Donc, en regardant les deux articles sqlbi référencés par Alex, nous pouvons faire l'une des choses suivantes pour potentiellement rendre les choses plus performantes, mais je ne sais toujours pas si la fonction FILTER doit se produire à l'intérieur ou à l'extérieur de l'autre syntaxe:

EVALUATE
FILTER (
    ADDCOLUMNS (
        SUMMARIZE ( 'Sales', Products[ProductName], 'Calendar'[CalendarYear] ),
        "Total Sales Amount", CALCULATE ( SUM ( Sales[SalesAmount] ) ),
        "Total Cost", CALCULATE ( SUM ( 'Sales'[TotalProductCost] ) )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

Et en utilisant la fonction 'SUMMARIZECOLUMNS':

EVALUATE
FILTER (
    SUMMARIZECOLUMNS (
        Products[ProductName],
        'Calendar'[CalendarYear],
        "Total Sales Amount", SUM ( Sales[SalesAmount] ),
        "Total Cost", SUM ( 'Sales'[TotalProductCost] )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

note 2

On dirait que SUMMARIZECOLUMNS a un paramètre FILTER intégré, donc je suppose que c'est la meilleure façon de se prémunir contre les problèmes de performances:

EVALUATE
SUMMARIZECOLUMNS (
    Products[ProductName],
    'Calendar'[CalendarYear],
    FILTER ( 'Products', Products[ProductName] = "AWC Logo Cap" ),
    "Total Sales Amount", SUM ( Sales[SalesAmount] ),
    "Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC
6
whytheq

Parmi les deux options que vous avez proposées, je soupçonne que cette dernière peut être plus efficace sur le plan informatique. Cependant, ni l'un ni l'autre n'est probablement "la meilleure pratique".

Selon Meilleures pratiques utilisant SUMMARIZE et ADDCOLUMNS sur sqlbi.com ,

vous devriez toujours privilégier la version ADDCOLUMNS. La règle générale est que vous ne devez jamais ajouter de colonnes étendues à l'aide de SUMMARIZE, sauf si cela est nécessaire en raison d'au moins l'une des conditions suivantes:

  • Vous souhaitez utiliser ROLLUP sur une ou plusieurs colonnes de regroupement afin d'obtenir des sous-totaux

  • Vous utilisez des expressions de table non triviales dans la colonne étendue, comme vous le verrez dans la section "Contexte de filtrage dans SUMMARIZE et ADDCOLUMNS" plus loin dans cet article

Veuillez également consulter leur article sur RESUMEIZOLUMNS , qui recommande la fonction la plus récente dans la plupart des cas d'utilisation.

6
Alexis Olson