学会了PowerBI简单的托托拽拽,是时候学习下DAX了
不学好DAX,PowerBI对你来说就是个娱乐工具。
对于学习PowerBI来说,看起来一切都很简单,但是不会DAX的话你永远不能说自己已经会Power BI了,DAX又是那么博大精深, 一起来学习下DAX,我们来通过一个例子,看看DAX可以干什么。
首先我们打开PowerBI,选择建模,点击新表,输入如下
Numbers =
SELECTCOLUMNS(
GENERATESERIES( 0,1000 ),
"N", [Value]
)
这样我们就可以创建了一张新表,这个意思是生成了一张名字为 Numbers,列为 N的表, GENERATESERIES( 0,1000 ),函数返回具有连续数字的列。 默认名字为[Value],SELECTCOLUMNS 从表中选取列,并且进行重命名。
然后我们再创建一个表Dates,生成了一段模拟的日期数据。
Dates =
VAR BaseTable =
CALENDAR ( DATE(2016, 1, 1), TODAY () ) //生成从2016-1-1到今天的日期
VAR AddYears =
ADDCOLUMNS (
BaseTable,
"Year", YEAR ( [Date] ) //生成年份
)
VAR AddMonths =
ADDCOLUMNS (
AddYears,
"Month", DATE(YEAR([Date]),MONTH([Date]),1), //生成月份
"Month label", FORMAT ( [Date], "MM YY" ) //月份标签
)
VAR AddDay =
ADDCOLUMNS (
AddMonths,
"Day Label", FORMAT ( [Date], "DDD d MMM YY" ) //日期标签
)
RETURN
AddDay
这段代码中,使用了变量,返回值等。 参考注释就知道是什么意思。
创建一张销售表,模拟销售数据
Sales =
VAR FirstTable =
SELECTCOLUMNS (
FILTER ( GENERATE ( Dates, Numbers ), [N] < RANDBETWEEN ( 2, 7 ) ),
"Date", [Date]
) //模拟随机销售日期
VAR AddPRoduct =
ADDCOLUMNS (
FirstTable,
"Product",
VAR myMake =
RANDBETWEEN ( 65, 90 )
VAR myModel =
FORMAT ( RANDBETWEEN ( 1, 5 ), "-#" )
RETURN
REPT ( UNICHAR ( myMake ), 3 ) & myModel
) //模拟产品编号
VAR AddQuantity =
ADDCOLUMNS (
AddProduct,
"Qty", VAR Q = RANDBETWEEN ( 1, 1000 ) RETURN 5 - INT ( LOG ( Q, 4 ) )
) //模拟销售数量
VAR AddPrice =
ADDCOLUMNS ( AddQuantity, "Price", DIVIDE ( RANDBETWEEN ( 1, 1e5 ), 100 ) ) //模拟价格
VAR AddTotal =
ADDCOLUMNS ( AddPrice, "Total", [Price] * [Qty] ) //模拟销售总价
RETURN
AddTotal
完成后如图
有了基础表,就可以做统计,做一个日统计的表
Daily Summary =
SUMMARIZECOLUMNS(
'Sales'[Date],
"Sum of Items Sold", SUM('Sales'[Qty]),
"Sum of Revenue", SUM('Sales'[Total])
)
在这里还可以通过添加计算列方式生成计算列,这一列是生成了当前日期的历史累加销售总额。
Calculate Revenue as Column =
CALCULATE(
SUM('Daily Summary'[Sum of Revenue]),
FILTER(
ALL('Daily Summary'),
'Daily Summary'[Date]<=EARLIER('Daily Summary'[Date])
)
)
完成后是这样的。
计算列的销售总额,可以用度量值来计算。因此还可以建立一个度量值,这样计算的结果应该是和计算列的结果一样。如图,但是如果进行过滤和切片后,结果就会不一样。
Calculate Revenue as Measure = CALCULATE(
SUM('Daily Summary'[Sum of Revenue]),
FILTER( ALLSELECTED('Daily Summary'[Date]),
'Daily Summary'[Date]<=MAX('Daily Summary'[Date])))
当然数据处理中还有很重要的统计分析。下面就统计 top 10的产品销售情况
All Sales for Top 10 Products =
VAR InnerGroup =
SUMMARIZECOLUMNS(
-- Group BY --
'Sales'[Product],
-- Aggregation Column --
"Sum of Revenue", SUM('Sales'[Total])
)
VAR Top10PRoducts =
TOPN(
10,
InnerGroup,
[Sum of Revenue],
DESC
)
RETURN
NATURALINNERJOIN (
'Sales',
Top10PRoducts
)
结果是这样的: