学会了PowerBI简单的托托拽拽,是时候学习下DAX了

学会了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
        )

结果是这样的:

以上是 DAX的一个比较丰富的实例,通过这个实例,自己能够更容易理解DAX。DAX很好玩。


展开阅读全文

没有更多推荐了,返回首页