博客:www.jiaopengzi.com
一、背景
经过了一个双十一后,天天面对的都是订单。于是有了关于销售订单按sku类型分类的需求。
说明:(暂且不讨论这样分类是否合理,需求方确实这样的)
1、sku字符长度小于等于8位为普通订单sku
2、sku字符长度大于8,且开头不是e字母为商家订单sku
3、sku开头是e字母为特殊订单sku
4、订单中只要包含普通订单sku的订单即为普通订单,如:订单100001
5、订单中不包含普通订单sku且包含商家订单sku的订单即为商家订单,如:订单100006
6、订单中只包含特殊订单sku的订单即为特殊订单,如:订单100007
要求:
1、按照日期维度,透视表展示总订单量,普通订单,商家订单,特殊订单订单数,及占比当日订单总是百分比。
结果表
二、数据源
数据源:订单表
偷懒就不建立日期表了。
输出
按照需求输出透视表
三、上度量值
总订单量
总订单量:=DISTINCTCOUNT('订单表'[订单号])
普通订单
普通订单:=
VAR T1=SUMMARIZE (
'订单表',
'订单表'[订单号],
"S1", SUMX ( ADDCOLUMNS ( '订单表', "S1", IF ( LEN ( '订单表'[SKU] ) <= 8, 1, 0 ) ), [S1] ),
"S2", SUMX (ADDCOLUMNS ('订单表',"S2", IF ( LEN ( '订单表'[SKU] ) > 8 && LEFT ( '订单表'[SKU], 1 )<>"e", 1, 0 )),[S2]),
"S3", SUMX (ADDCOLUMNS ( '订单表', "S3", IF ( LEFT ( '订单表'[SKU], 1 )="e" , 1, 0 ) ),[S3])
)
VAR T2=FILTER(T1,[S1]>0)
RETURN
CALCULATE('订单表'[总订单量],T2)
普通订单%
普通订单%:=DIVIDE('订单表'[普通订单],'订单表'[总订单量])
商家订单
商家订单:=
VAR T1=SUMMARIZE (
'订单表',
'订单表'[订单号],
"S1", SUMX ( ADDCOLUMNS ( '订单表', "S1", IF ( LEN ( '订单表'[SKU] ) <= 8, 1, 0 ) ), [S1] ),
"S2", SUMX (ADDCOLUMNS ('订单表',"S2", IF ( LEN ( '订单表'[SKU] ) > 8 && LEFT ( '订单表'[SKU], 1 )<>"e", 1, 0 )),[S2]),
"S3", SUMX (ADDCOLUMNS ( '订单表', "S3", IF ( LEFT ( '订单表'[SKU], 1 )="e" , 1, 0 ) ),[S3])
)
VAR T3=FILTER(T1,[S1]=0&&[S2]>0)
RETURN
CALCULATE('订单表'[总订单量],T3)
商家订单%
商家订单%:=DIVIDE('订单表'[商家订单],'订单表'[总订单量])
特殊订单
特殊订单:=
VAR T1=SUMMARIZE (
'订单表',
'订单表'[订单号],
"S1", SUMX ( ADDCOLUMNS ( '订单表', "S1", IF ( LEN ( '订单表'[SKU] ) <= 8, 1, 0 ) ), [S1] ),
"S2", SUMX (ADDCOLUMNS ('订单表',"S2", IF ( LEN ( '订单表'[SKU] ) > 8 && LEFT ( '订单表'[SKU], 1 )<>"e", 1, 0 )),[S2]),
"S3", SUMX (ADDCOLUMNS ( '订单表', "S3", IF ( LEFT ( '订单表'[SKU], 1 )="e" , 1, 0 ) ),[S3])
)
VAR T4=FILTER(T1,[S1]=0&&[S2]=0&&[S3]>0)
RETURN
CALCULATE('订单表'[总订单量],T4)
特殊订单%
特殊订单%:=DIVIDE('订单表'[特殊订单],'订单表'[总订单量])
四、总结
1、如上需求用sql很好写;
2、主要利用ADDCOLUMNS,创建新的条件列,SUMX再聚合;
3、根据说明的4、5、6三点得到,T2,T3,T4的筛选上下文;
4、给出T1-T4的过程截图帮助理解,注意观察S1,S2,S3和说明4、5、6的对应关系。
T1
T2
T3
T4
by 焦棚子