作为高大上的分析语言,DAX可以像SQL一样实现数据集的查询,并能在更复杂的分析中游刃有余。
数据查询(query)可以分为两个基本类型:Project Columns投影字段列、Filter Rows筛选明细行。

1、SQL和DAX投影字段
在SQL中,SELECT之后直接指定字段列,就能实现查询列,这里不会对明细行做任何的限制。
-- 查询 -- project
select -- 指定分组,完成聚合
"Country/Region",
"Quantity"
from public.sales
在DAX中,可以使用SELECT COLUMNS实现类似的操作。
SELECTCOLUMNS (sales,
Sales[CustomerKey],
Sales[ProductKey],
Sales[Order Number],
Sales[Quantity],
Sales[Unit Price]
)
当然,在SQL中,可以使用AS为字段重命名;在DAX中,重命名在字段之前,在使用summarizecolumn时,这个是必选项。
SUMMARIZECOLUMNS (
Sales[Order Number], -- group by
"@total-qty", SUM(Sales[Quantity])
)
2、SQL和DAX筛选明细行
SQL筛选有多个功能实现,最简单的是where。如果要保留所有的字段列(不投影指定字段,或者说全部投影),只需要SELECT * FROM结合WHER即可完成。
不过,企业环境中不推荐使用SELECT * 的操作,此时就要和投影字段列和筛选明细行结合起来。如下所示。
-- 保留所有的字段列,使用where增加限制条件
select
*
from public.sales
where "Segment" ='Consumer' -- 返回满足条件的数据明细
-- 问题的经典结构
select -- 指定分组,完成聚合
"Country/Region",
SUM("Quantity") as "total qty" -- 聚合的最常见的类型
from public.sales
where "Segment" ='Consumer' -- 返回满足条件的数据明细
group by "Country/Region"
在DAX中,筛选明细行也有很多方法,典型的是FILTER。
比如,要对数据表Sales做条件筛选(比如保留2007年6月4日的交易行),可以如下完成:
// 执行字段投影和筛选 使用filter
EVALUATE
filter(
sales
Sales[Order Date]) =date(2007,6,4)
)
当然,更多情况下,分析师还是仅仅需要保留自己需要的少数字段,这就需要投影字段列和筛选行的结合,这个过程,相比SQL略显复杂一些——如下所示,借助于filter中嵌套selectcolumn表操作函数完成。
// 执行字段投影和筛选 使用filter
EVALUATE
filter(
SELECTCOLUMNS (
sales,
Sales[CustomerKey],
Sales[Order Date]
),
Sales[Order Date]) =date(2007,6,4)
)
3、SQL和DAX的简单对比
首先,SQL天生是为查询数据而生的,所以在查询明细并做简单处理时,语法清晰、逻辑简单,但是在处理复杂分析问题(包含聚合)时逐渐略显老态,SQL直到很久才支持窗口函数(可以完成聚合的多遍聚合)。Tableau的逻辑是SQL +VIZ,所以既能延续SQL的简洁、优雅,又具备了可视化的美观。
而DAX是天生的分析高手,查询反而不是它的强项,所以看上去比SQL还要笨拙一些(特别是同时投影和筛选时)。
其次,作为天生的分析工具,DAX用逻辑上的复杂性,换取了更深、更大空间的可能性,特别是在复杂的多遍聚合、中间表计算时,用各种预置的函数就可以完成分析工作。
这样的好处是,它很专业;代价是,太专业了吓到了很多初学者。
by 喜乐君
Pingback: 数据分析,绕不过SQL、DAX、VizQL(上) - 喜乐君
评论已关闭。