Я хочу вычислить меру 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?