交叉表 列字段排序_PowerBI创建日期表

PowerBI中最常用的表是什么?毫无疑问,日期表!

不同行业的分析,维度表有类别之分,数据表有指标计算之别。但当谈到日期时,基本是一致的。而且日期表也是我们使用时间智能的前提。

8e18a19fb9a4d51e97e55e78a7999364.png

由于日期表、时间智能公式非常的好用,往往在做分析时我们都会加入一张日期表。对于我个人,因为经常会收到一些读者发来的数据建模问题,建立日期表对我来说也是一项重复性操作。如何以最快的速度生成一张通用而且好用的日期表呢?很多人都想要找到一个适合自己的最优方案。

常见的方法有四种:

1) 用Excel制作,导入PowerBI (这是最灵活的方法,尤其在使用定制的日历表时)

ed713cbe68616f4fd9bcb51bda59a519.png

2) PowerQuery生成,利用编辑查询器中的添加日期列功能(这是以往我比较喜欢的方式,在日历表的使用文章中曾介绍过)

df57ad203a82e586a48e1f54db5737b3.png

3) 复制前人写过的PowerQueryM代码。这种方法很快很方便,只不过对于很多人这属于黑箱操作,并不理解语句的具体含义。

847e7c859b65fc2ec3a2526f4d974be9.png

4) 写DAX公式生成
本文想推荐的就是这第四种写DAX公式的方法,它是所有方法中最快的。
最近在实践中经常使用,屡试不爽。只需要两个步骤,新建表,再复制一段DAX公式。

877c8fe42fd3dda1b149c22d44c70d1f.png

为什么说这是一个非常好用的方法?我的理由有4点:

1. 上图例子中,Calendar函数生成了一张2016年12月28日到2017年12月31日的日期表。这里的日期可以随意的去替换。

bd167403c9a88580a1b8222ac6da86df.png

并且,还可以把起始日期替换成Firstdate和Lastdate,比如Firstdate('销售数据表'[订单日期])可以得到销售数据表中的最早订单日期,Lastdate可以得到最近的日期,此方法生成的日期表将永远等于数据表的日期范围,这往往也是我们想要得到的效果。

2. Addcolumns的含义是在生成日期表基础上添加列,这与使用Excel制表的逻辑是一样的。利用基本的日期函数Year、Month、Weeknum和算式求得每一个日期的年季度月日,这些函数与Excel的函数相同,对Excel的使用者来讲不难理解。

Marco说这个公式执行了很多重复的计算,如果利用VAR、Generate、Row函数可以调成最优。

eeea5b8226c73690f3be5ccfdeb18cd4.png

但我认为日期表即使跨度十年也就是3650行,用写两倍长的代码来提升0.0X秒的计算速度,并没有什么吸引力。如果说在速度和简单上来找一个平衡,我更倾向于简单。(当然,这只是针对日期表这个例子。Marco的那篇文章主要是为了说明Generate/Row可以更好地取代Addcolumns,这是另一个有意义的话题。)

3. 注意到在建立[年月]列时,我使用的方法是Year([Date])*100+Month([Date])数字计算,而不是利用Format函数生成“年份月份”的文本格式。这样的好处是在后期使用中不会涉及到日期表的排序问题。(比如经常会遇到“2016年11月”会排在“2016年2月”的前面,而用201611和201602就会很好地避免了这种问题)

bd167403c9a88580a1b8222ac6da86df.png

4. 这个公式并不难,保存下来可以复制粘贴使用。即使手工输入也不会很费力气。最重要的是你能够理解此公式的含义,根据自己的需要利用Excel类的简单日期函数做调整。

我把公式写在了下面,供直接复制使用。

--------------------------

日期表 = ADDCOLUMNS (
CALENDAR ( date(2016,12,28),date(2017,12,31) ),
"年", YEAR ( [Date] ),
"季度", ROUNDUP( MONTH ( [Date] )/3,0 ),
"月", MONTH ( [Date] ),
"周", WEEKNUM([Date]),
"年季度", YEAR ( [Date] ) & "Q" & ROUNDUP( MONTH ( [Date] )/3,0 ) ,
"年月", YEAR ( [Date] ) * 100 + MONTH ( [Date] ),
"年周", YEAR ( [Date] ) * 100 + WEEKNUM ( [Date] ),
"星期几", WEEKDAY([Date])
)

--------------------------

09eca1b58c438ee34916547ac04467eb.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值