微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 DAX 而不是快速度量从行总数计算百分比

如何解决如何使用 DAX 而不是快速度量从行总数计算百分比

我正在尝试使用行总数按月获得类别搜索的百分比。我可以通过快速度量来实现它,但我想知道它背后的DAX功能

Input

我编写了以下 DAX,但它为矩阵表中的每个单元格提供了 100%

#Share Of SRPV = 
Var AllSRPV = CALculaTE([TotalSrPV],All('Supply Data'[Date-f].[MonthNo]))
Return
DIVIDE([TotalSrPV],AllSRPV)

可能是什么原因?

解决方法

您正在使用 Power BI 的自动日期时间功能计算随时间变化的值,在后台 Power BI 按 Dates[Date].[MonthNo] 对月份列进行排序,以便一月、二月和三月按其逻辑顺序出现,而不是升序基于文本值的顺序,因为此操作,您会看到按 JFMAMJJASOND(月份首字母缩写)顺序排列的月份。

现在,Dates[Date].[Month]Dates[Date].[MonthNo] 列都具有 1:1 关系,因此即使您使用 Dates[Date].[Month],列 Dates[Date].[MonthNo] 也是交叉过滤 {{ 1}}。因此,对于每个单元格,您正在使用 ALL 删除过滤器,但交叉过滤器会干扰您的计算。

如果您只对解决方案感兴趣,请使用此:

Dates[Date].[Month]

要了解更多信息,请进一步阅读:

首先要做的是关闭自动日期/时间,确保在设置中取消选中日期/时间选项,如下图所示:

Auto date/time

接下来,您需要创建一个合适的日期表,没有日期表永远不会计算随时间变化的值;您可以在 Power Query 中执行此操作或创建 DAX 计算表:

要在 Power Query 中执行此操作,请将此代码粘贴到高级编辑器中:

#Share Of SRPV =
VAR AllSRPV =
    CALCULATE (
        [TotalSrPV],ALL ( 'Supply Data'[Date-f].[MonthNo],'Supply Data'[Date-f].[Month] )
    )
RETURN
    DIVIDE ( [TotalSrPV],AllSRPV )

要创建 DAX 表,请使用:

let
    RandomDates = { #date ( 2021,1,1 ),#date ( 2018,3,6 ),#date ( 2022,12,30 ) },DateColumnInputTable = InputTable[Date],// Replace this with the column of any table with the help of which you want to build a date table:                                                                                                                                                                                                                                                                                                         
    Source = List.Distinct ( RandomDates ),DateList =
        let
            MinDate       = List.Min ( Source ),MaxDate       = List.Max ( Source ),StartDate     = Number.From ( #date ( Date.Year ( MinDate ),1 ) ),EndDate       = Number.From ( #date ( Date.Year ( MaxDate ),31 ) ),Calendar      = { StartDate .. EndDate },ToTable       = Table.FromList ( Calendar,Splitter.SplitByNothing(),null,ExtraValues.Error ),ToDate        = Table.TransformColumnTypes ( ToTable,{ "Column1",type date } ),ChangeColName = Table.RenameColumns ( ToDate,{ { "Column1","Date" } } )
        in
            ChangeColName,MonthName = Table.AddColumn ( DateList,"Month Name",each Date.MonthName ( [Date] ),type text ),MonthNumber = Table.AddColumn ( MonthName,"Month Number",each Date.Month ( [Date] ),Int64.Type ),CalendarYear = Table.AddColumn ( MonthNumber,"Calendar Year",each Date.Year ( [Date] ),DayName = Table.AddColumn ( CalendarYear,"Day of Week Name",each Date.DayOfWeekName ( [Date] ),DayNumber = Table.AddColumn ( DayName,"Day of Week Number",each Date.Day ( [Date] ),MonthShortName = Table.AddColumn ( DayNumber,"Month Initials",each Text.Start ( Date.MonthName ( [Date] ),3 ),QuarterName = Table.AddColumn ( MonthShortName,"Quarter",each "Q" & Text.From ( Date.QuarterOfYear ( [Date] ) ),QuarterNumber = Table.AddColumn ( QuarterName,"Quarter Number",each Date.QuarterOfYear ( [Date] ),Int64.Type )
in
    QuarterNumber

完成后,将日期表标记为日期表。

Mark as date table

接下来假设您使用以下 DAX 代码构建如下报告:

Dates =
VAR ListOfDate =
    VAR MinDate =
        MIN ( Sales[Order Date] ) -- Change with the column reference of your table
    VAR MaxDate =
        MAX ( Sales[Order Date] ) -- Change with the column reference of your table
    VAR StartDate =
        DATE ( YEAR ( MinDate ),1 ) -- DATE ( 2021,1 )
    VAR EndDate =
        DATE ( YEAR ( MaxDate ),31 ) -- DATE ( 2021,31 )
    VAR Result =
        CALENDAR ( StartDate,EndDate )
    RETURN
        Result
VAR Result =
    GENERATE (
        ListOfDate,VAR CurrentDate = [Date]
        RETURN
            ROW (
                "Month",FORMAT ( CurrentDate,"MMMM" ),MONTH ( CurrentDate ),"CY " & YEAR ( CurrentDate ),"Calendar Year Number",YEAR ( CurrentDate )
            )
    )
RETURN
    Result

Report

一切都如您所愿,但只要您按月份编号对“月份名称”列进行排序,计算就会停止工作。

Month sorted

排序后报告:

Broken report

问题在于,Power BI 在后台生成以下代码,其中包含月数:

Total Sales CY = 
CALCULATE ( 
    [Total Sales],REMOVEFILTERS ( Dates[Month] )
)

为了便于阅读,我将删除计算小计/总计的函数。

EVALUATE
SUMMARIZECOLUMNS (
    ROLLUPADDISSUBTOTAL (
        'Dates'[Calendar Year Number],"IsGrandTotalRowTotal",ROLLUPGROUP ( 'Dates'[Month],'Dates'[Month Number] ),"IsDM1Total"
    ),"Total_Sales",'ReportMeasures'[Total Sales],"Total_Sales_CY",'ReportMeasures'[Total Sales CY]
)

现在您可以轻松看到 EVALUATE SUMMARIZECOLUMNS ( 'Dates'[Calendar Year Number],'Dates'[Month],'Dates'[Month Number],[Total Sales],[Total Sales CY] ) 操作中也使用了 Month Number,并且 GroupBy 列是视觉对象中存在的筛选上下文的主要原因。

如果我评论 Month Number 列,我会得到正确的结果:

DAX Studio's result

如果我能以某种方式阻止该列过滤 CALCULATE 中的度量,我可以获得我想要的结果;这样做的方法是在 ALL/REMOVEFILTERS 中包含月份数列:

Working report

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。