惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

Power BI – Ed_'s Blog

Power BI里DAX上下文转换到底是怎么转换的 – yywr's Blog 中国式报表学习解析-多级表头&自定义小计 – yywr's Blog 中国式一页纸矩阵表报告制作解析 – yywr's Blog NPS模型Power BI报表解析记录 – yywr's Blog 数据模型初探 – yywr's Blog PowerBI中DAX语言的上下文是什么 – yywr's Blog [初接触] DAX 中的行上下文与EARLIER() 函数 – yywr's Blog
Power BI 由于缺少事实数据,X轴日期不连续 – yywr's Blog
yywr · 2021-12-11 · via Power BI – Ed_'s Blog

当前效果和问题

上图效果中日期不连续,因为缺少数据,想要让没有数据的日期段用0填充起来,但是不得法

涉及的DAX公式

Per.CallBack.bySelectDate = DIVIDE([Qty.In.GP.CallBack.bySelectDate] , [Qty.NeedCallBack.GP.bySelectDate])


Qty.In.GP.CallBack.bySelectDate = 
//需要回拨且已回拨数量
CALCULATE(
    [Qty.In.GP.BySelectDate],
   'F_Call_Log'[处理状态] in {"已留言","振铃未接听","排队放弃"},
   'F_Call_Log'[备注] <> ""
)


Qty.NeedCallBack.GP.bySelectDate = [Qty.In.GP.CallBack.bySelectDate] + [Qty.In.GP.NonCallBack.bySelectDate] )


Qty.In.GP.NonCallBack.bySelectDate = 
//轮询呼入,未接通需回拨数量
CALCULATE(
    [Qty.In.GP.BySelectDate],
   'F_Call_Log'[处理状态] in {"已留言","振铃未接听","排队放弃"},
   'F_Call_Log'[备注] = ""
)


Qty.In.GP.BySelectDate = 
CALCULATE(
    [Qty.In.bySelectDate],
    F_Call_Log[CallType] in { "Group" }
)


Qty.In.bySelectDate = 
CALCULATE(
    [Qty.In],
    FILTER('DateTable.MonthWeek',AND( [Date] >= [SelectDate.Start], [Date] <= [SelectDate.End] ) )
)

模型说明

1, 我的日期筛选不是用的常规方式,我建立了两个表 ‘DateTable.Slect.End’ ,‘DateTable.Slect.Start’

2, ‘DateTable.MonthWeek’ 用的是老师的化钻取为点选的方式

3. 模型连线如下

失败的尝试

问题的原因是因为数据的缺少,导致DIVIDE 算出来的是空值,我尝试在DIVIDE之外使用0去填充,但是没达到我想要的效果,多半是因为我所使用的日期筛选方法落下的坑,但不知道怎么解决

尝试解法一,很明显不合要求

Per.CallBack.bySelectDate = 
VAR v_SelDate = SELECTEDVALUE('DateTable.MonthWeek'[Date])
VAR v_ActualPer = DIVIDE([Qty.In.GP.CallBack.bySelectDate] , [Qty.NeedCallBack.GP.bySelectDate])
RETURN
IF(
    ISBLANK(v_ActualPer) ,
    0,
    v_ActualPer
)

尝试解法二,又回到了最开始的状态

Per.CallBack.bySelectDate = 
VAR v_SelDate = SELECTEDVALUE('DateTable.MonthWeek'[Date])
VAR v_ActualPer = DIVIDE([Qty.In.GP.CallBack.bySelectDate] , [Qty.NeedCallBack.GP.bySelectDate])
RETURN
IF(
    ISBLANK(v_ActualPer) && AND(v_SelDate >= [SelectDate.Start] , v_SelDate<= [SelectDate.End]) ,
    0,
    v_ActualPer
)

最终的解决方法

解决方法三:divide 参数部分加0

Per.CallBack.bySelectDate = DIVIDE([Qty.In.GP.CallBack.bySelectDate] +0 , [Qty.NeedCallBack.GP.bySelectDate] +0)

结尾总结

造成这个问题是一个巧合,以下两者因素碰在一起就会出现问题

  1. 对时间列的筛选是DAX 公式判断
  2. X轴用的不是时间列 (比如这里用的item 其实是为了使用 “化钻取为点选” 而造的列)

当满足上面两个因素的时候,对于无数据项目的显示会造成X轴在显示时突破我们设定的时间边界

解决的方法有两种

  1. 是使用时间列做X轴,但是大部分情况下不使用时候列是有原因的
  2. 在DAX公式的合适位置 +0  ,以达到显示空值的效果

本例解法一中,+0 相当于显示空值的操作,我们要做的是 +0, 但是要保持住DAX公式里的筛选,要在外层环境与实际计算公式之间去加,这个列子就是在分子/分母度量的计算上下文(内层计算)和DIVIDE计算上下文(外层计算)之间去加