如何解决如何使用 DAX 而不是快速度量从行总数计算百分比
我正在尝试使用行总数按月获得类别搜索的百分比。我可以通过快速度量来实现它,但我想知道它背后的DAX功能。
我编写了以下 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]
要了解更多信息,请进一步阅读:
首先要做的是关闭自动日期/时间,确保在设置中取消选中日期/时间选项,如下图所示:
接下来,您需要创建一个合适的日期表,没有日期表永远不会计算随时间变化的值;您可以在 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
完成后,将日期表标记为日期表。
接下来假设您使用以下 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
一切都如您所愿,但只要您按月份编号对“月份名称”列进行排序,计算就会停止工作。
排序后报告:
问题在于,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 列,我会得到正确的结果:
如果我能以某种方式阻止该列过滤 CALCULATE 中的度量,我可以获得我想要的结果;这样做的方法是在 ALL/REMOVEFILTERS 中包含月份数列:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。