Power BI-DAX

Power BI-DAX

https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2016/ee634396(v=sql.130)

https://dax.guide/

1、数据的提取和合并

根据数据的位置提取数据
left:从左取

=left([字段],3)     # 从左取3位

right:从右取(写法与left一致)
mid:中间取

=mid([字段],4,3)    # 从第4位开始取3位(索引值从1开始,取的时候包括第4位)

len:长度
find/search:查找

=find("要找的东西",[从哪个字段找])
=search("要找的东西",[从哪个字段找])
    
# 两个返回的都是索引值,基本一样,find区分大小写,search不分大小写

=find("要找的东西",[从哪个字段找],开始查找的位置,找到返回值)
=find("要找的东西",[从哪个字段找],1,0)

# 后面两个参数可以不写
CT-21911后面的数字长度不一样,要想提取后面的数字:(下图)
len([会员ID]):整个字符串的长度(8)
find("-",[会员ID]):‘-’的位置是3
那么8-3=5就是右边数字的长度
right:从右边提取数字


=right([会员ID],len([会员ID])-find("-",[会员ID]))


求年龄

=year(today())-[出生年代]

2、数据的格式转换

value:转换成数值
format:日期或数字格式的转换
https://mp.weixin.qq.com/s?__biz=MzI4NTEzNzQ2NQ==&mid=2650500289&idx=1&sn=b171ff6552b4833095fa7f272f2b5726&chksm=f3ff0397c4888a81611dba91abc62717cff19b906b0c6feeebdd3b874efa57374e5b560f91d2&scene=21#wechat_redirect

=format([日期],"yyyy-mm-dd")
格式规范说明
y将年显示为不带前导零的数字(0-9)。如果这是用户定义数字格式的唯一字符,则使用%y。
yy以带一个前导零的两位数字格式显示为年(如果适用)。
yyyy以四位数字显示格式显示年
M将月显示为不带前导零的数字(例如一月:1)。如果这是用户定义数字格式的唯一字符,则使用%M。
MM以带一个前导零的两位数字格式显示为月(如:01、02、03)。
MMM将月显示为缩写(如:Jan)
MMMM将月显示为完整月份,如:January
d将天显示为不带前导零的数字(例如一号:1)。如果这是用户定义数字格式的唯一字符,则使用%d。
dd以带一个前导零的两位数字格式显示为天(如:01、02、03)。
ddd将天显示为缩写(如:Sun)
MMMM将天显示为完整月份,如:Sunday

replace:替换

# CT-21911中第4位的2替换成8(CT-81911)

=replace([会员ID],4,2,8)

substitute:查找和替换

# CT-21911中的“-”替换成“/”  -->  CT/21911

=substitute([会员ID],"-","/")

3、常用的DAX函数

3.1、聚合函数

函数说明
SUM求和
AVERAGE求平均值
MEDIEN求中位数
MAX最大值
MIN最小值
COUNT数值格式的计数
COUNTA所有格式的计数
COUNTBLANK空格计数
COUNTROWS表格行数
DISINCTCOUNT不重复计数

COUNT和COUNTA不计空白值

3.2、逻辑函数

函数说明
IF根据某个/几个逻辑判断是否成立,返回指定的数值
IFERROR如果计算出错,返回指定值
AND逻辑关系的“且”-&&
OR逻辑关系的“或”-ll
SWITCH数值转换
=if([金额]>1000,"Y","N")

AND里面只能写两个表达式,如果需要三个就需要在写一个AND,嵌套

=AND([金额]>1000,[送货时长]<10)

多个并列可以有个两个连接符

=IF([金额]>1000&&[送货时长]<10,"T","F")

IFERROR

# 如果计算错误返回0,或返回空白(BLANK())
=IFORROR([销售金额]/[任务额],0)

SWITCH

=SWITCH([客户省份],"广东","北上广","北京","北上广","上海","北上广","非北上广")

在这里插入图片描述

=SWITCH(true(),[客户省份]="广东"||'订单明细'[客户省]="北京"|| '订单明细'[客户省]="上海","北上广","非北上广")

在这里插入图片描述

3.3、信息函数

函数说明
ISBLANK是否空值
ISNUMBER是否数值
ISTEXT是否文本
ISNONTEST是否非文本
ISERROR是否错误

返回TRUE、FALSE

3.4、数学函数

函数说明
ABS绝对值
ROUND四舍五入
ROUNDUP向上舍入
ROUNDDOWN向下舍入
INT向下舍入到整数(取整数)

3.5、文本函数

在这里插入图片描述

3.6、转换函数

函数说明
FORMAT日期或数字格式转换
VALUE转换成数值
INT转换成整数
DATE转换成日期格式
TIME转换成时间格式
CURRENCY转换成货币

3.7、日期和时间函数

在这里插入图片描述

# 求保质期至
=EDATE([生产日期],[保质期])

3.8、关系函数

函数说明
RELATED从“一”端提取/引用“多”端的列值
RELATEDTABLE从“多”端提取/引用“一”端的相关行的表格

相当于表格的vlookup

3.9、Calculate函数

=Calculate(表达式(度量值),筛选条件1,...筛选条件n)

把条件写死,不受切片器的影响

3.10、divide(安全除法)

3.11、手写切片器

营业收入 = SWITCH(TRUE(),
SELECTEDVALUE('抵消-筛选器'[抵消筛选])="抵消前",
CALCULATE(SUM('事实表-实际&预算&预测明细'[实际金额]), '事实表-实际&预算&预测明细'[一级科目] IN { "营业收入" }),
SELECTEDVALUE('抵消-筛选器'[抵消筛选])="合并后",
CALCULATE(SUM('事实表-实际&预算&预测明细'[合并后实际金额]), '事实表-实际&预算&预测明细'[合并后一级科目] IN { "营业收入" })

3.12、小技巧

power bi怎样获取时间切片器上的值,如何让时间筛选只跟一个区间的最后一个时间有关?

①、我先将Date类型的字段拖进去后,选择TopN,设置Top1后在把Yearmonth字段拖进去,设置最大值的Yearmonth。完成!

②、

只显示切片器最后一个时间的值 = 
IF(
MAX('日期表'[月份])=MAXX(ALLSELECTED('日期表'[月份]),'日期表'[月份]),
[销售金额]
)

# 切片器的最大值,最小值的取值
MAXX(ALLSELECTED('维度表-时间'[月]),'维度表-时间'[月])
MINX(ALLSELECTED('维度表-时间'[月]),'维度表-时间'[月])

# 使用FILTER先过滤下,使得返回一张表日期只有最大月份的
人数 = CALCULATE(SUM('事实表-人员清单'[在职人数]),FILTER('事实表-人员清单','事实表-人员清单'[报表期间月]=MAXX(ALLSELECTED('维度-时间'[月ID]),'维度-时间'[月ID])))


https://www.zhihu.com/question/328099158

VAR的用法
在这里插入图片描述

分组聚合函数- SUMMARIZE

在这里插入图片描述
查询语句

返回的是一张表格

=FILTER('销售记录','销售记录'[产品]="自行车")

=CALCULATE(SUM('销售记录'[金额],'销售记录'[产品]="自行车")

summarize:汇总功能,相当于group by

summarize(表格,汇总列1,....,"名称",表达式)

返回的是一张表格,最终的结果是汇总所有订单下的销售金额总和
=summarize('销售记录','销售记录'[订单编号],"金额",'销售记录'[销售金额])

RFM分析

定义:

类别含义分析语言演示公式
RRecent近度最近一次交易到今天的天数MIN([近度]);[近度]=TODAY()-[下单日期]
FFrequency频度交易次数DISTINCTCOUNT([订单编号])
MMonetary平均消费额度交易金额/交易次数DIVIDE(‘销售记录’[销售金额],‘销售记录’[订单数量])

客户分类:

RFM客户类型
重要价值客户
重要保持客户
重要发展客户
重要挽留客户
一般价值客户
一般保持客户
一般发展客户
一般挽留客户
近度
近度=today()-[下单日期]         (新建列)
R=MIN([近度])                       (度量值)

订单的不重复计数
F=DISTINCTCOUNT([订单编号])                (度量值)

M=DIVIDE('销售记录'[销售金额],'销售记录表'[F])            (度量值)

=SUMMARIZE('销售记录','销售记录'[客户名称],'销售记录'[客户ID],"R",'销售记录'[R],"F",'销售记录'[F],"M",'销售记录'[M])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GENERATE(笛卡尔积表)

=generate(表1,表2)

在这里插入图片描述

高级聚合函数

函数说明
SUMX求和
AVERAGEX求平均值
MAXX求最大值
MINX求最小值
COUNTX数值格式的计数
COUNTAX所有格式的计数
MEDIENX求中位值
RANKX排名
SUMX:求表达式里的和(单价*金额)
=SUMX('销售记录','销售记录'[单价]*'销售记录'[数量])

常用的筛选器函数

函数说明
FILTER按条件筛选数据
VALUES返回列或者表去重后的结果\
TOPN返回前几名的数据\
ALL所有数据
ALLEXCEPT所欲数据除了…
ALLNONBLANKROW返回非空白的数据

FILTER

=FILTER('销售记录','销售记录'[产品]="自行车")

VALUES

返回非重复的一列值(去重之后的数据)
=VALUES('销售记录'[产品名称])

TOPN

这张表的前3行
TOP3=TOPN(3,'销售记录')

销售金额的前3(默认降序)
TOP3=TOPN(3,'销售记录','销售记录'[金额])
升序
TOP3=TOPN(3,'销售记录','销售记录'[金额],ASC)

Except
Except(A, B)
A中除去B中的剩下所有。(A-B)如下图阴影部分
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191011141852992.png

ALLEXCEPT(除什么之外的所有)
在这里插入图片描述

返回新的一张表里面会少“产品名称”这一列
=ALLEXCEPT('销售记录','销售记录'[产品名称])

在这里插入图片描述
在这里插入图片描述
求区域经理对应的销售金额,区域经理跟销售记录,省份区域都没有关联

=SUMX(FILTER('销售记录','区域经理'[区域]=RELATED('省份区域'[区域])),'销售记录'[金额])

EARLIER

=SUMX(FILTER('产品销售表',EARLIER('产品销售表'[销售金额])<='产品销售表'[销售金额]),'产品销售表'[销售金额])

在这里插入图片描述
累计百分比(all)

='产品销售表'[销售金额]/sumx(all('产品销售表'),'产品销售表'[销售金额])

在这里插入图片描述
使用earlier进行排名

=COUNTROWS(FILTER('产品销售表',EARLIER('产品销售表'[销售金额])<='产品销售表'[销售金额]))+1

在这里插入图片描述
EARLIER区分新老客户
金额有数值就是老客户,空白的就是新客户

=IF(SUMX(FILTER('销售记录',EARLIER('销售记录'[客户ID])='销售记录'[客户ID]&&EARLIER('销售记录'[下单日期])>'销售记录'[下单日期],'销售记录'[金额])>0,"老客户","新客户")


在这里插入图片描述

%=[销售额]/CALCULATE([销售额],ALL'产品分类'))

USERELATIONSHIP

两张表之间是虚线关系,需要用USERELATIONSHIP来表明关系
在这里插入图片描述

=CALCULATE(SUM([数量]),USERELATIONSHIP('销售记录'[实际送货日期],'日历年'[日期]))

RELATEDTABLE

排名:可以展开二级分类,在分类里可以有自己的排名
在这里插入图片描述

参数DESC/ASC,升降序;Dense/Skip:相同排名是否跳过去
=RANKX(ALLSELECTEC('产品分类'),'销售记录'[销售额])

为了排除总计算进去排名

HASONEVALUE:在这张表里找到的产品名称就是TRUE,没有就是FALSE
H=HASONEVALUE('产品分类'[产品名称])

=IF(H,RANKX(ALLSELECTEC('产品分类'),'销售记录'[销售额]),BLANK())

TOP10分析
根据切片器的选择进行排名规则,前N名
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MIN=MIN('排序依据'[ID])

SWITCH=SWITCH('排序依据'[MIN],1,'销售记录'[销售额],2,'销售记录'[销售数量],3,'销售记录'[订单数量])

RANK=RANKX(SUMMARIZE(ALL('销售记录'),'销售记录'[客户名称],'排序依据'[SWITCH])

经销商RFY分析

缩写解释公式
RReach,达成DISTINCTCOUNT([客户名称])
FFrequency,频率订单数/客户数
YYield,收益销售额/订单数

在这里插入图片描述
使用父子层级
在这里插入图片描述
在这里插入图片描述

创建层级
层级path=path('打车记录'[姓名],'打车记录'[经理])

层级深度
=PATHLENGTH('打车记录'[层级path])

移动平均
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
用量增长分析

当月MTD=TOTALMOD('用量'[总用量],'日历年'[日期],'日历年'[日期]'<TODAY())

上月PM=CALCULATE('用量'[总用量],PREVIOUSMONTH('日历年'[日期]))

月度净增长='用量'[当月MTD]-'用量'[上月PM]

powerbi知识大集合

https://www.jianshu.com/p/ad534d6b84c7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值