作为高大上的分析语言,DAX可以像SQL一样实现数据集的查询,并能在更复杂的分析中游刃有余。
数据查询(query)可以分为两个基本类型:Project Columns投影字段列、Filter Rows筛选明细行。
➊ 投影筛选:SQL简洁而DAX显笨拙
➋ 领域分工:SQL查数据DAX做分析
➌ DAX优势:多遍聚合与中间表计算
1、SQL和DAX投影字段
在SQL中,SELECT之后直接指定字段列,就能实现查询列,这里不会对明细行做任何的限制。
-- 查询 -- project
select -- 指定分组,完成聚合
"Country/Region",
"Quantity"
from public.salesSELECTCOLUMNS (sales,
Sales[CustomerKey],
Sales[ProductKey],
Sales[Order Number],
Sales[Quantity],
Sales[Unit Price]
)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"比如,要对数据表Sales做条件筛选(比如保留2007年6月4日的交易行),可以如下完成:
// 执行字段投影和筛选 使用filter
EVALUATE
filter(
sales
Sales[Order Date]) =date(2007,6,4)
)// 执行字段投影和筛选 使用filter
EVALUATE
filter(
SELECTCOLUMNS (
sales,
Sales[CustomerKey],
Sales[Order Date]
),
Sales[Order Date]) =date(2007,6,4)
)3、SQL和DAX的简单对比
而DAX是天生的分析高手,查询反而不是它的强项,所以看上去比SQL还要笨拙一些(特别是同时投影和筛选时)。
其次,作为天生的分析工具,DAX用逻辑上的复杂性,换取了更深、更大空间的可能性,特别是在复杂的多遍聚合、中间表计算时,用各种预置的函数就可以完成分析工作。
这样的好处是,它很专业;代价是,太专业了吓到了很多初学者。
by 喜乐君
No comments yet