DAX: вычислить меру без текущей строки

Я хочу вычислить меру DAX «без» текущей строки. Вот пример, основанный на AdventureWorksDW2014.

evaluate
    summarize(
        'FactInternetSales'

        , 'DimProduct'[ProductSubcategoryName]

Меры на уровне ячейки, они определены как в https://docs.microsoft.com/en-us/sql/analysis-services/lesson-5-create-calculated-columns

        , "Margin", [InternetTotalMargin]       -- InternetTotalMargin := SUM([Margin])
        , "Cost", [InternetTotalProductCost]    -- InternetTotalProductCost := SUM([TotalProductCost])

Я определил новую меру, которая представляет собой совокупность (соотношение) существующих мер:

        , "Gross Margin", [GrossMargin]         -- GrossMargin := DIVIDE([InternetTotalMargin], [InternetTotalProductCost])

Итоги столбца:

        , "Total Margin", calculate([InternetTotalMargin], allselected('DimProduct'))
        , "Total Cost", calculate([InternetTotalProductCost], allselected('DimProduct'))

Итоги столбца без текущей строки, полученные вычитанием выражения значения ячейки из выражения общего значения столбца:

        , "Total Margin w/o Subcat", calculate([InternetTotalMargin], allselected('DimProduct')) - [InternetTotalMargin]
        , "Total Cost w/o Subcat", calculate([InternetTotalProductCost], allselected('DimProduct')) - [InternetTotalProductCost]

Это выполняет все агрегации перед применением формулы:

        , "Total Gross Margin", calculate([GrossMargin], allselected('DimProduct'))

Я хочу рассчитать «Общую валовую маржу» без «текущей строки». Моя первая попытка дает желаемый результат, но зависит от точного знания формулы, лежащей в основе GrossMargin. Это «явный», потому что мы, по сути, повторно реализуем вычисление после вычитания «текущей строки» из числителя и знаменателя. Я хочу иметь возможность делать это с помощью мер, формула которых мне неизвестна или формула потенциально более сложна, чем простое деление.

        , "Total Gross Margin w/o Subcat (Explicit)",

            -- explicitly repeat the division formula
            divide(

                -- explicitly recompute the numerator
                calculate([InternetTotalMargin], allselected('DimProduct')) - [InternetTotalMargin]

                -- explicitly recompute the denominator
                , calculate([InternetTotalProductCost], allselected('DimProduct')) - [InternetTotalProductCost]
            )

        -- next step/where this is meant to be used:
        , "Gross Margin Impact (Explicit)", calculate([GrossMargin], allselected('DimProduct')) - divide(calculate([InternetTotalMargin], allselected('DimProduct')) - [InternetTotalMargin], calculate([InternetTotalProductCost], allselected('DimProduct')) - [InternetTotalProductCost])

Мне нужно более общее решение, которое не требует знания расчетов, примерно так:

        /*
        , "Gross Margin w/o Subcat", calculate([GrossMargin], allselected('DimProduct' Except Current Row)
        , "Gross Margin Impact, calculate([GrossMargin], allselected('DimProduct')) - calculate([GrossMargin], allselected('DimProduct' Except Current Row)
        */

Различные неудачные попытки (с использованием Margin, а не GrossMargin, поскольку это легче проверить):

        , "Trial 1", calculate([InternetTotalMargin], except(all('DimProduct'), 'DimProduct')) -- incorrect value
        , "Trial 2", calculate([InternetTotalMargin], allexcept('DimProduct', 'DimProduct'[ProductSubcategoryName])) -- incorrect value
        , "Trial 3", calculate([InternetTotalMargin], allexcept('DimProduct', 'DimProduct'[ProductCategoryName])) -- incorrect value
        , "Trial 4", calculate([InternetTotalMargin], allexcept('DimProduct', 'DimProduct'[ProductKey])) -- incorrect value
        , "Trial 5", calculate([InternetTotalMargin], 'DimProduct') -- incorrect
        , "Trial 6", calculate([InternetTotalMargin], 'DimProduct'[ProductSubcategoryName] <> 'DimProduct'[ProductSubcategoryName]) -- illogical, and blank result
        -- , "Trial 7", calculate([InternetTotalMargin], 'DimProduct'[ProductSubcategoryName] <> [ProductSubcategoryName]) -- invalid syntax
        -- running out of ideas here
    )
;

Возможно ли это вообще в DAX?


person Jonathan Stone    schedule 08.07.2017    source источник


Ответы (1)


Нет, в DAX это невозможно. Если вы хотите вычислить меру, вам нужно сначала ее определить. Вы не можете создать заполнитель / вставить здесь формулу / и надеяться на лучшее. Что вы можете сделать, так это использовать ключевое слово VAR, чтобы определить свою меру, вычислить различные меры во время расчета и выберите наиболее подходящий. В качестве альтернативы и, если возможно, используйте вызывающую функцию, чтобы определить меру методом «замены».

person Hila DG    schedule 07.05.2018
comment
Спасибо Hila DG. Могу ли я выполнить замену, которую вы предлагаете, из DAX, то есть eval для DAX, или это должно происходить из какого-либо клиентского инструмента (Excel, Power BI и т. Д.)? - person Jonathan Stone; 09.05.2018