博客:www.jiaopengzi.com

焦棚子的文章目录
请点击下载附件

一、背景

某天在和**那还是叫我大铁吧** 交流关于季度&月度同时展示的问题,感概中国式报表真的需求很微妙。

下面来看看到底是什么。

A、效果图

B、动态效果

[video width=“852” height=“608” mp4=“https://jiaopengzi.com/wp-content/uploads/2020/03/129_2.mp4”][/video]

接下来我们用三种度量的写法来说明。

方法3由**那还是叫我大铁吧** 提供,我们感谢他。

二、数据源

1、日期表:calendar

因为是日期时间维度的不同展现,都围绕着日期表做文章,所以建立一个合适的日期表很重要。

个人喜欢用pq生成日期表code如下:

letdate_start=#date(2018, 1, 1),//开始日期date_end=#date(2019, 12, 31),//结束日期count=Duration.Days(date_end-date_start),//间隔天数calendar = #table(type table[dates=date,year=Int64.Type,month=Int64.Type,day=Int64.Type,year_m=Int64.Type,quarter=Int64.Type,year_q=Int64.Type,weeknumber=Int64.Type,weekday=Int64.Type,weekus=text,weekcn=text,weekcna=text,M=text,YM=text,Q=text,YQ=text],List.Transform({0..count},(n)=> let d=Date.AddDays(date_start,n) in {d//日期,Date.Year(d)//年,Date.Month(d)//月,Date.Day(d)//天,Date.Year(d)*100+Date.Month(d)//年月组合,Date.QuarterOfYear(d)//季度,Date.Year(d)*100+Date.QuarterOfYear(d)//年季度组合,Date.WeekOfYear(d,1)//周一开始的一年第几周,Date.DayOfWeek(d,1)//星期几,Date.DayOfWeekName(d, "en-US")//星期几英文,Date.DayOfWeekName(d, "zh-CN")//星期几中文,Text.End(Date.DayOfWeekName(d, "zh-CN"),1)//星期几简写,"M"&Date.ToText(d,"MM"),Date.ToText(d,"Yyy")&"M"&Date.ToText(d,"MM"),"Q"&Number.ToText(Date.QuarterOfYear(d)),Date.ToText(d,"Yyy")&"Q"&Number.ToText(Date.QuarterOfYear(d))}))
incalendar

2、事实表:data

用pq生成的随机数据(拿到附件后,若数据和文章截图不一样是正常的。)

3、维度表

分别为事实表维度表,以及季度&月度辅助表。

4、关系视图

A、方法1&方法3的关系视图

B、方法2的关系视图

注意:方法2中两条虚线的使用。

三、上DAX

1、基础度量:total

total = SUM(data[value])

2、方法1:test0

test0 =
VAR N =MAX ( 'CALENDAR'[MONTH] )
VAR T1 =SUMMARIZE (FILTER ( ALL ( 'CALENDAR' ), 'CALENDAR'[MONTH] <= N ),'CALENDAR'[M],'CALENDAR'[Q],'CALENDAR'[MONTH],'CALENDAR'[QUARTER])
VAR T2 =ADDCOLUMNS ( T1, "@QM", IF( N / 3 <= [QUARTER], [M], [Q] ) )//是否显示整季度关键:"<="
VAR T3 =SUMMARIZE ( T2, [@QM] )
VAR TQ =FILTER ( T3, LEN ( [@QM] ) <= 2 )
VAR TM =FILTER ( T3, LEN ( [@QM] ) > 2 )
VAR I =SUM ( 'aux0'[INDEX] )
RETURNSWITCH (TRUE (), I >= 1&& I <= 4, CALCULATE ('Measure'[total]//基础度量,TREATAS ( TQ, 'CALENDAR'[Q] ),TREATAS ( VALUES ( 'aux0'[QM] ), 'CALENDAR'[Q] ),ALL ( 'CALENDAR'[M] )),I >= 5&& I <= 16, CALCULATE ('Measure'[total]//基础度量,TREATAS ( TM, 'CALENDAR'[M] ),TREATAS ( VALUES ( 'aux0'[QM] ), 'CALENDAR'[M] ),ALL ( 'CALENDAR'[M] )),BLANK ())

3、方法1:test1

test1 =
VAR N =MAX ( 'CALENDAR'[MONTH] )
VAR T1 =SUMMARIZE (FILTER ( ALL ( 'CALENDAR' ), 'CALENDAR'[MONTH] <= N ),'CALENDAR'[M],'CALENDAR'[Q],'CALENDAR'[MONTH],'CALENDAR'[QUARTER])
VAR T2 =ADDCOLUMNS ( T1, "@QM", IF( N / 3 < [QUARTER], [M], [Q] ) )//是否显示整季度关键:"<="
VAR T3 =SUMMARIZE ( T2, [@QM] )
VAR TQ =FILTER ( T3, LEN ( [@QM] ) <= 2 )
VAR TM =FILTER ( T3, LEN ( [@QM] ) > 2 )
VAR I =SUM ( 'aux0'[INDEX] )
RETURNSWITCH (TRUE (), I >= 1&& I <= 4, CALCULATE ('Measure'[total]//基础度量,TREATAS ( TQ, 'CALENDAR'[Q] ),TREATAS ( VALUES ( 'aux0'[QM] ), 'CALENDAR'[Q] ),ALL ( 'CALENDAR'[M] )),I >= 5&& I <= 16, CALCULATE ('Measure'[total]//基础度量,TREATAS ( TM, 'CALENDAR'[M] ),TREATAS ( VALUES ( 'aux0'[QM] ), 'CALENDAR'[M] ),ALL ( 'CALENDAR'[M] )),BLANK ())

4、方法2:test0

test0 =
VAR N =MAX ( 'CALENDAR'[MONTH] )
VAR IQ=MAX('calendar'[quarter])
VAR I =SUM ( 'aux0'[INDEX] )
RETURNSWITCH (TRUE (), I < IQ, CALCULATE ('Measure'[total]//基础度量,USERELATIONSHIP('calendar'[Q],'aux0'[QM]),ALL ( 'CALENDAR'[M] )),I<=IQ*3+4&& I >(IQ-1)*3+4&&I<=N+4, CALCULATE ('Measure'[total]//基础度量,USERELATIONSHIP('calendar'[M],'aux0'[QM]),ALL ( 'CALENDAR'[M] )),BLANK ())

5、方法2:test1

test1 =
VAR N =MAX ( 'CALENDAR'[MONTH] )
VAR IQ=MAX('calendar'[quarter])
VAR I =SUM ( 'aux0'[INDEX] )
VAR TF=MOD(N,3)
RETURNSWITCH (TRUE (), I <= IQ && NOT(TF), CALCULATE ('Measure'[total]//基础度量,USERELATIONSHIP('calendar'[Q],'aux0'[QM]),ALL ( 'CALENDAR'[M] )), I < IQ && TF, CALCULATE ('Measure'[total]//基础度量,USERELATIONSHIP('calendar'[Q],'aux0'[QM]),ALL ( 'CALENDAR'[M] )),I<IQ*3+4&& I >(IQ-1)*3+4 && TF, CALCULATE ('Measure'[total]//基础度量,USERELATIONSHIP('calendar'[M],'aux0'[QM]),ALL ( 'CALENDAR'[M] )),BLANK ())

6、方法3:test0

test0 =
VAR FindQ =FIND ( "Q", SELECTEDVALUE ( aux0[QM] ),, 0 ) //是否存在Q
VAR DQ =CALCULATE (MIN ( 'calendar'[Q] ),FILTER ( 'calendar', [Q] = SELECTEDVALUE ( 'calendar'[Q] ) ) ) //当前季度
VAR DM =CALCULATE (MIN ( 'calendar'[M] ),FILTER ( 'calendar', [M] = SELECTEDVALUE ( 'calendar'[M] ) )) //当前月份
VAR DQMinMonth =CALCULATE ( MIN ( 'calendar'[M] ), FILTER ( ALL ( 'calendar' ), [Q] = DQ ) ) //当前季度最小月份
VAR RQ =FILTER ( VALUES ( 'aux0'[QM] ), LEN ( [QM] ) = 2 )//季度
VAR RM =FILTER ( VALUES ( 'aux0'[QM] ), LEN ( [QM] ) > 2 )//月
RETURN
SWITCH (TRUE (),FINDQ > 0&& SELECTEDVALUE ( 'aux0'[QM] ) < DQ, CALCULATE (SUM ( DATA[VALUE] ),TREATAS ( RQ, 'calendar'[Q] ),TREATAS ( VALUES ( aux0[QM] ), 'calendar'[Q] ),ALL ( 'calendar'[M] )),FINDQ = 0&& SELECTEDVALUE ( aux0[QM] ) <= DM&& SELECTEDVALUE ( aux0[QM] ) >= DQMINMONTH, CALCULATE (SUM ( DATA[VALUE] ),TREATAS ( RM, 'calendar'[M] ),TREATAS ( VALUES ( aux0[QM] ), 'calendar'[M] ),ALL ( 'calendar'[M] )),BLANK ()
)</code></pre>

``7、方法3:test1

test1 =
VAR TF=MOD(AVERAGE('calendar'[month]),3)//季度月末显示季度or月度
VAR FindQ =FIND ( "Q", SELECTEDVALUE ( aux0[QM] ),, 0 ) //是否存在Q
VAR DQ =CALCULATE (MIN ( 'calendar'[Q] ),FILTER ( 'calendar', [Q] = SELECTEDVALUE ( 'calendar'[Q] ) ) ) //当前季度
VAR DM =CALCULATE (MIN ( 'calendar'[M] ),FILTER ( 'calendar', [M] = SELECTEDVALUE ( 'calendar'[M] ) )) //当前月份
VAR DQMinMonth =CALCULATE ( MIN ( 'calendar'[M] ), FILTER ( ALL ( 'calendar' ), [Q] = DQ ) ) //当前季度最小月份
VAR RQ =FILTER ( VALUES ( 'aux0'[QM] ), LEN ( [QM] ) = 2 )//季度
VAR RM =FILTER ( VALUES ( 'aux0'[QM] ), LEN ( [QM] ) > 2 )//月
RETURN
SWITCH (TRUE (),FINDQ > 0 && SELECTEDVALUE ( 'aux0'[QM] ) <= DQ&& NOT(TF), CALCULATE (SUM ( DATA[VALUE] ),TREATAS ( RQ, 'calendar'[Q] ),TREATAS ( VALUES ( aux0[QM] ), 'calendar'[Q] ),ALL ( 'calendar'[M] )),FINDQ > 0 && SELECTEDVALUE ( 'aux0'[QM] ) < DQ , CALCULATE (SUM ( DATA[VALUE] ),TREATAS ( RQ, 'calendar'[Q] ),TREATAS ( VALUES ( aux0[QM] ), 'calendar'[Q] ),ALL ( 'calendar'[M] )),FINDQ = 0&& SELECTEDVALUE ( aux0[QM] ) <= DM&& SELECTEDVALUE ( aux0[QM] ) >= DQMINMONTH && TF, CALCULATE (SUM ( DATA[VALUE] ),TREATAS ( RM, 'calendar'[M] ),TREATAS ( VALUES ( aux0[QM] ), 'calendar'[M] ),ALL ( 'calendar'[M] )),BLANK ()
)</code></pre>

`

四、总结

1、思维依然是业务转换是筛选上下文;

2、方法1&方法3都是利用TREATAS创建虚拟关系来实现目的;

3、方法2中利用的虚线关系USERELATIONSHIP实现目的,同时方式2兼容PP,目前TREATAS不兼容PP,(更新:office365支持TREATAS)

4、本案例可以衍生如:动态坐标轴、动态维度展示等,可以举一反三的。

彩蛋:季度&月度动态坐标轴

相对比较简单就不单独赘述;见文章素材附件。

[video width=“1064” height=“924” mp4=“https://jiaopengzi.com/wp-content/uploads/2020/03/129_9.mp4”][/video]

by 焦棚子

焦棚子的文章目录

` ``

129_Power PivotPower BI DAX不同维度动态展示动态坐标轴相关推荐

  1. 124_Power PivotPower BI DAX优化计算最大连续次数

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最大连续次数或者是最大连续子序列问题,在DAX中如何快速计算呢? 思路 1.N-1:按照INDEX错位 2.ST ...

  2. 123_Power PivotPower BI DAX函数说明速查

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 说明 1.基于DAX Studio 2.9.2版本导出整理: 2.DAX Studio网站,及时更新下载,DAX学习利器: ...

  3. 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前面已经写过一个先进先出的库龄案例,在业务发生又有这样一个需求:先进先出前提,需要按照订单计算每个商品在库时间, ...

  4. Python 快速生成 web 动态展示机器学习项目!

    来源丨网络 作者丨wedo实验君 1. Streamlit 一句话,Streamlit是一个可以用python编写web app的库,可以方便的动态展示你的机器学习的项目. 优点 你不需要懂html, ...

  5. django jsonresponse_利用 Django 动态展示 Pyecharts 图表数据的几种方法

    本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法! Django 模板渲染 1. 新建一个 Django 项目 命令 ...

  6. 【ajax+php】动态展示4级单位(省、市、县、镇)

    1.本篇教程以ajax+php动态展示[省.市.县.镇]四级地区单位 2.效果图:    3.不废话,贴代码! HTML: <div class="form-group"&g ...

  7. js大屏导出图片_超大图片全屏动态展示js插件

    intense-images是一款非常实用的超大图片全屏动态展示js插件.该图片查看插件可以全屏显示超大图片,可以使用鼠标来和图片进行交互,上下左右移动鼠标会相应的移动图片,对于超大图片的展示是非常好 ...

  8. 思源高拍仪万能驱动_动态展示和教学 良田YL1050AF高拍仪评测

    高拍仪的一大特点就是灵活多样,通过不同的工业设计用于文件扫描.视频展示.多媒体教学.信息采集.体温监测等等.良田最新款YL1050AF教学高拍仪通过巧妙的设计和专业的软件,为教学.培训.实时展示等应用 ...

  9. 【转】设备数据通过Azure Functions 推送到 Power BI 数据大屏进行展示

    设备数据通过Azure Functions 推送到 Power BI 数据大屏进行展示(1.准备工作) 原创 Sean Yu 云计算实战 2019-12-06 本案例适用于开发者入门理解Azure F ...

最新文章

  1. 编写和调试Shader程序(1)
  2. IOS属性类型的讲解
  3. mysql-proxy 0.8.5_主从读写分离----mysql-proxy0.8.5安装与配置
  4. 【效率】超详细!手把手带你快速入门 GitHub!
  5. ajax 在新选卡打开,开始使用 AJAX 控制工具包 (VB) | Microsoft Docs
  6. (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)
  7. php 按位左移,PHP位运算符
  8. 小米要用 AI + IoT 做年轻人的第一套智能家居
  9. android sepolicy报错解决
  10. 什么原因导致MacBook Pro过热?如何解决这一问题?
  11. 如何查看java安装成功_如何查看java是否安装成功
  12. BIOS设置图解教程 BIOS设置图解教程之AMI篇
  13. 计算机为什么采用二进制
  14. mac如何把html转成word,Pages怎么保存为word格式 pages保存格式教程
  15. 一品制药创业板IPO过会:年营收3.82亿 拟募资5亿
  16. SQL server课程设计-景点门票销售管理系统(基于Javagui制作)
  17. JAVA实现CRC16校验
  18. 大数据量的五种处理方式
  19. Mysql-基础命令
  20. 星际炸弹——炸弹爆炸时间计算

热门文章

  1. 11-mysql-查询进阶六-多表连接查询-自关联查询-练习题
  2. dj电商-模型类设计-1.x-模型类抽象基类
  3. django-演练-添加老师-form表单方式添加
  4. 史上最快! 10小时大数据入门(一)-大数据概述
  5. RocketMQ 重试机制
  6. Linux unit14
  7. Windows下Nginx的启动、停止等基本命令
  8. 用位运算实现求绝对值-有效避开if-else判断
  9. 手工打造目标PE的步骤
  10. 免费流量监控软件,最大可同时监控1000台电脑