重点函数 | 表函数与 DAX 查询


Hello,小伙伴们大家好,今天讲解下表函数与DAX查询。
在写DAX的时候,我们往往会通过筛选表来得到想要的数据,但是这个过程在公式中嵌套比较抽象,需要脑补相应的画面,而表函数可以帮助我们还原对应的数据,帮助理解。除此之外,可以生成临时需要的表,不再需要excel或数据库导入,或者做一些类似SQL查询,方便查数,来看下具体示例:

1.GENERATE与ROW组合使用

当我需要模拟一张每日流水表时,这个组合可以帮我快速得到想要的表。
打开Power BI Desktop,选择建模下的新表选项卡:
file

输入DAX公式:

每日销售额表=
  GENERATE (
    CALENDAR ( DATE ( 2019, 1, 1 ), TODAY () ),
    ROW ( "销售额", RANDBETWEEN( 200, 1000) )
)

file

下面我们来看一下Power BI Desktop中的函数解释:

GENERATE 
GENERATE(<Table1>,<Table2>)
将为第一个表中的每一行计算第二个表表达式。返回第一个表与这些结果的叉积。
ROW
ROW(<name>, <expression>][,<name>, <expression>]…])
返回具有DAX表达式指定的新列的单行表。
RANDBETWEEN
RANDBETWEEN(<bottom>,<top>)
返回您指定的数值之间的一个随机数。

通过Power BI Desktop的函数解释可以知道,ROW函数生成的是单行表,而GENERATE是表一的每一行计算表二的表达式,然后返回表一与每一行表达式结果的叉积,即日历表的每一天都生成ROW函数的随机数,然后返回这些结果。

2.DATATABLE生成静态表

DATATABLE
DATATABLE (ColumnName1, DataType1, ColumnName2, DataType2..., {{Value1, Value2...}, {ValueN, ValueN+1...}...})
返回具有以内联方式定义的数据的表。

第一个参数是名称,第二个参数是名称的类型,这是列一,然后每两个参数是一列,一个参数说明列的名称,一个参数说明列的类型,列写完后,就是写行记录了,每一行用花括号括起来,每行用逗号隔开,每行都写完后要用花括号再把行记录都括起来,这样就生成了一张静态表。

静态表 = DATATABLE (
    "姓名",STRING,
    "性别", STRING,
    "年龄",INTEGER,
    "职业",STRING,
    {
        { "Johnson","男", 25,"教师" },
        { "Emily","女", 23,"律师" },
        { "Ken","男", 32,"公务员" }
    }
)

还是在新表下创建。

file

3.用表函数进行DAX查询

有一张物理表(Excel导入Power BI Desktop)记录了以下信息,需要查看各市各类别的产品销售汇总情况,这时可以用SUMMARIZE或者ADDCOLUMNS。
file

file

SUMMARIZE的第一个参数是表,后面的参数是要汇总聚合的列,然后添加一列名称,是要汇总的值。这里需要注意的是SUMMARIZE本身具有行列筛选组,度量会自动进行筛选转换,不需要CALCULATE显式转换。
如果是用ADDCOLUMNS就需要显式转换了。
file

表查询2 =
ADDCOLUMNS (
    SUMMARIZE ( '物理表', '物理表'[类别], '物理表'[省] ),
    "销售额", CALCULATE ( SUM ( '物理表'[销售额]) )
)
ADDCOLUMNS

ADDCOLUMNS(<table>, <name>, <expression>[, <name>, <expression>]…)  

返回具有DAX表达式指定的新列的表。

ADDCOLUMNS,顾名思义,就是添加列,那当然是给表添加列,所以第一参数是要添加列的表,然后,是要添加列的名称,对应列的表达式。
这里需要注意的是ADDCOLUMNS具有行筛选,但是需要用CALCULATE将行筛选转换为列表筛选,才能得到正确的值。

问:邯郸市每日销售额大于980元的产品有哪些,共计销售多少天?

答:先用DAX查询筛选出需要的表,然后求值。

完整的度量如下:

天数 = 
COUNTROWS (
    CALCULATETABLE (
        VALUES( '物理表'[Date] ),
        FILTER( '物理表', '物理表'[市] = "邯郸市" && '物理表'[销售额] > 980 )
    )
)

file

用新建表函数得出符合条件的表。
file

再把日期单独去重查询。

file

对应的产品去重查询。
file

以上就是今天分享的内容,下次再会~~

  • PowerPivot工坊原创文章,转载请注明出处!

    如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

Power Pivot工坊