我想计算一个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中甚至可能吗?
答案 0 :(得分:0)
不,这在DAX中是不可能的。 如果要计算度量,则需要先定义它。您无法在此处创建占位符/ 插入公式 /并希望获得最佳效果。 您可以使用关键字VAR 来定义您的度量,计算计算时的不同度量并选择最适合的度量。或者,如果可能,使用调用函数通过“替换”方法定义度量。