Power Pivot 系列 (4) - DAX 查询

2024-02-05 13:32
文章标签 查询 系列 power pivot dax

本文主要是介绍Power Pivot 系列 (4) - DAX 查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Power Pivot 通过 DAX 查询可以实现从不同的视角查看数据。但在 Excel 中编写 DAX 查询却不太方便,所以本篇在讲解 DAX 查询用法的时候,以 DAX Studio 作为工具。关于 DAX Studio 请自行在网上搜索,我的上一篇也有介绍。

本篇的示例数据来自 《DAX 圣经》这本书,示例数据我已经上传到 github,文章的末尾有链接,方便大家学习。

查询表的所有数据

DAX 查询一般从 EVALUATE 关键字开始,可以把 DAX 查询语句理解为 EVALUATE 关键字引导的表达式构成的语句。比如我要查询 Sales 表的所有数据,DAX 查询语句为:

-- 查询 Sales 表所有数据
EVALUATE Sales


相当于 SQL 语句的 SELECT * FROM Sales; 第一行是注释。

字段排序

DAX 查询的 ORDER BY 关键字引导的表达式对查询结果进行排序。升序为 ASC,降序为DESC 。

-- 按 Order Date字段排序
EVALUATE
Sales ORDER BY [Order Date] ASC

DAX 支持按多个字段排序:

EVALUATE
Sales
ORDER BY[Order Date] ASC,[CustomerKey] ASC

选择指定字段

SQL 语句选择指定字段很直观:SELECT A, B FROM sometable。DAX 查询选择指定字段用 SUMMARIZE 函数。SUMMARIZE 函数第一个参数为 table 的名称,后面跟若干个字段,即可以选择指定的列:

EVALUATE
SUMMARIZE ( 'Sales', [ProductKey], [OrderDateKey], [Quantity], [Unit Price] )

DAX 查询结果的界面:

数据筛选

数据筛选用 FILTER 函数,FILTER 函数第一个参数为 table 名称,第二个参数为筛选表达式,返回值为 table。比如我们要筛选出 Product 表中所有 Class 为 Economy 的数据:

EVALUATE
FILTER ( 'Product', Product[Class] = "Economy")

分组计算

数据透视表就是分组计算,如果我们要数据透视表的逻辑,但并不需要数据透视表的格式,使用 DAX 查询的分组计算作为输出就非常合适。分组计算用到 SUMMARIZE 函数的标准用法。SUMMARIZE 函数语法如下:

SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>, <expression>]…) 

函数的第一个参数是 table 名称;第二组参数是一系列列名称,根据列名进行分组,比如先按照客户,再按照产品名称等等;第三组参数由 name 和 expression 成对构成,比如 name 为 toal quantity, expression 为 SUM([Quantity],就根据 Quantity 列来计算合计数。假设我们需要按客户来计算销售的数量:

EVALUATE
SUMMARIZE ( Sales, [CustomerKey], "Total Sales", SUM ( Sales[Quantity] ) )

多字段分组:先按照客户,再按照产品分组计算销售数量的合计:

EVALUATE
SUMMARIZE (Sales,[CustomerKey],[ProductKey],"Total Quantity", SUM ( Sales[Quantity] )
)
ORDER BY [CustomerKey]

基于多表的操作

前面的示例都是基于一个表,接下来讲解多表关联的 DAX 查询。Power Pivot 中表的关系在关系图视图中维护,关系维护好后,在 DAX 查询时,表的关系都为左连接且不能修改为其它连接方式。这种机制虽然降低了灵活性,但却让 DAX 基于多表的查询语法变得非常简单。

比如我们要查询基于客户名称和产品名称的销售数量明细。我们刚才讲过,返回指定字段用 SUMMARIZE 函数:

EVALUATE
SUMMARIZE (Sales,Customer[Company Name],'Product'[Product Name],Sales[Quantity]
)

查询结果截图如下:

这个查询涉及到 3 个表的关联,相同功能的 SQL 语句要复杂得多。同理,基于多个表的分组计算,也是只需要选择某个表的字段,而不需要关注表的关系。我们来对基于客户和产品计算销售数量合计的查询进行变更:

EVALUATE
SUMMARIZE (Sales,Customer[Company Name],'Product'[Product Name],"Total Sales", SUM ( Sales[Quantity] )
)

查询的截图如下:


数据筛选也能自由地使用其他表的字段。比如下面的示例,查询 Sales 表,但筛选条件是 Product 的 Brand 为 Litware。需要用到 RELATED 函数:

EVALUATE
FILTER ( Sales, RELATED ( Product[Brand] ) = "Litware" )

基于多表筛选且选择指定字段

嵌套使用 FILTERSUMMARIZE 函数能达到这种效果。先用 SUMMARIZE 函数返回一个包含指定列的表,然后用 FILTER 函数基于这个计算表进行筛选:

EVALUATE
FILTER (SUMMARIZE (sales,Customer[Country],Product[Brand],"Total Quantity", SUM ( Sales[Quantity] )),[Brand] = "Contoso"
)

添加列

添加列在 Power Pivot 中非常容易,但我们也可以在 DAX 查询中使用 ADDCOLUMNS 函数来添加列。ADDCOLUMNS 函数的语法如下:

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

根据函数的语法,我们知道,可以一次添加多个列。下面的示例添加了一个计算列:计算出每一行的销售金额(单价 * 数量):

EVALUATE
ADDCOLUMNS ( Sales, "Line Prcie", Sales[Quantity] * Sales[Unit Price] )

定义变量

在 DAX 查询中,可以使用 VAR 定义变量,使用变量能够简化 DAX 查询语句的编写。定义变量需要在 EVALUATE 之前用 DEFINE 关键字引导,用 VAR 定义变量。比如,我们先定义一个按客户的国别和产品品牌分组计算销售数量的表,将这个表保存在变量 groupedSales 中,然后对销售按品牌进行筛选:

DEFINEVAR groupedSales =SUMMARIZE (Sales,Customer[Country],'Product'[Brand],"Total Quantity", SUM ( Sales[Quantity] ))
EVALUATE
FILTER ( groupedSales, [Brand] = "Contoso" )

在 DAX 查询中定义度量值

DAX 查询也可以定义度量值。度量值用 MEASURE 关键字定义,MEASURE 返回一个标量值。比如我们要按照品牌计算出销售额,先定义一个度量值,然后再基于品牌来作为筛选上下文计算。这种方法相对难懂,仅为了介绍定义度量值的方法。注意下面 DAX 查询中度量值的表达方法。

DEFINEMEASURE Sales[salesamt] =SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
EVALUATE
ADDCOLUMNS ( VALUES ( 'Product'[Brand] ), "Total Sales", 'Sales'[salesamt] )

示例数据

github - sample data

参考

  • 理解EVALUATE语法
  • Using DAX to retrieve tabular data

这篇关于Power Pivot 系列 (4) - DAX 查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681065

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

ural 1026. Questions and Answers 查询

1026. Questions and Answers Time limit: 2.0 second Memory limit: 64 MB Background The database of the Pentagon contains a top-secret information. We don’t know what the information is — you

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(