DAX:计算度量"没有"当前行

时间:2017-07-08 20:28:17

标签: dax ssas-tabular

我想计算一个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中甚至可能吗?

1 个答案:

答案 0 :(得分:0)

不,这在DAX中是不可能的。 如果要计算度量,则需要先定义它。您无法在此处创建占位符/ 插入公式 /并希望获得最佳效果。 您可以使用关键字VAR 来定义您的度量,计算计算时的不同度量并选择最适合的度量。或者,如果可能,使用调用函数通过“替换”方法定义度量。