看到漂漂亮亮的PowerBI报表,手痒痒怎么办?!

有没有面对着稀奇古怪的DAX而感到有点丈八金刚摸不着头脑或者干瞪眼?!

有没有想得到某个值想不出来DAX怎么写而直跳脚!?

看完这篇文章,你会恍然大悟,捂脸偷笑。呼呼呼~

前言:

这篇文章对于具有一点SQL查询基础人会十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等。

注:此文不涉及到Filter Context(筛选上下文)的介绍。

正文:

对于对SQL有一定了解的人来说,咋看DAX,怎么都不习惯。 但是,如果理解以下几个后,DAX学起来就得心应手一些。


SUMMARIZE
FILTER
CALCULATE 与 CALTULATETABLE

注:这里不会对这些语法详细的讲解,而是从SQL的角度,看看那些DAX的等价相似语句。

欢迎转载,请保留原文链接和作者信息。O(∩_∩)O谢谢。 DAX基础 - 30分钟掌握从SQL到DAX 作者:马丁叔叔
链接:http://www.cnblogs.com/lizardbi/p/DAX-FOUNDATION-DAX-FOR-SQL-DEVELOPER-IN-30-MINUTES.html

先来看一个例子,

查询Products表里的所有行:

 DAX
SQL
-- list all the Products
EVALUATE
Product
show all the Products
SELECT *
FROM tblProduct

DAX Filter vs SQL Filter

DAX SQL
EVALUATE
FILTER (
Product,
RELATED ( Category[Product Category Name] ) = "Bike"
)
SELECT * FROM Product P
JOIN Category c on P.[Category_KEY] = c.[Category_KEY]
WHERE
c.[Product Category Name] = 'Bikes'

FILTER是一个MUST know的语句

从Transaction表中统计销售数目 - SUM-GRUOP BY:

DAX SQL
-- 显示每个产品销售数目
EVALUATE
SUMMARIZE (
'Transaction',
'Transaction'[ProductId],
"Total qty", SUM ( 'Transaction'[Quantity] )
)
-- 显示每个产品销售数目
SELECT ProductId, SUM(Quantity) AS 'Total Qty' 
FROM tblTransaction
GROUP BY ProductId

SUMMERIZE

选择一个表中指定的列:

DAX SQL
-- list selected columns
EVALUATE
SUMMARIZE(
Product,
Product[Name],
Product[Size])
-- show selected columns
SELECT
Name,
Size
FROM tblProduct

排序:

DAX SQL
-- show products in name order
EVALUATE
Product
ORDER BY Product[ProductName]
-- show products by name
SELECT *
FROM tblProduct
ORDER BY ProductName

选择前几行:

DAX SQL
-- show 5 most expensive products
EVALUATE
TOPN ( 5, Product, Product[FullPrice] )

SELECT TOP 5
FROM Product
ORDER BY FullPrice

SUMMERIZE vs Group BY

SUMMARIZE是一个比较重要语句:

记住:这个跟SQL极为相似,学习过程中只要想想SQL就容易理解很多了。

EVALUATE
SUMMARIZE(
源表名,
Group by 列 1,
...,
Group by 列 N,
汇总列名1,
汇总列名1所对应的表达式,
...,
汇总列名N,
汇总列名N所对应的表达式
)

再来一个例子:

对产品的分类,颜色,产品名字进行统计:交易单量,销售数目

MSDN的例子

DAX
SQL
EVALUATE
SUMMARIZE('Internet Sales'  
      , ROLLUP('Date'[Calendar Year], 'Product Category'[Product Category Name])  
      , "Sales Amount", SUM('Internet Sales'[Sales Amount])  
      , "Discount Amount", SUM('Internet Sales'[Discount Amount])  
)  
SELECT D.[Calendar Year], PC.[Product Category Name]
, SUM(F.[Sales Amount]) 'Sales Amount'
, SUM(F.[Discount Amount]) 'Discount Amount'
FROM [Internet Sales] F
JOIN DATE D ON S.[DAY_KEY] = F.[DAY_KEY]
JOIN [Product Category] PC ON PC.[Category_KEY] = F.[Category_KEY]
GROUP BY
D.[Calendar Year],PC.[Product Category Name]
Date[Calendar Year] Product Category[Product Category Name] [Sales Amount] [Discount Amount]
2005 Bikes 6958251.043 4231.1621
2006 Bikes 18901351.08 178175.8399
2007 Bikes 24256817.5 276065.992
2008 Components 2008052.706 39.9266
... ... ... ...

等价的SQL如下,如果你只看浅蓝色的部分,是不是很好理解呢?

SUMMARIZE还有其他的Option,这里就不做详细介绍。

SUMMARIZE详情参考:https://msdn.microsoft.com/en-us/library/gg492171.aspx

CALCULATETABLE vs Sub Query

下面语句统计Bike这个类别的产品的销售数目。

DAX SQL
EVALUATE
SUMMARIZE (
CALCULATETABLE (
'Internet Sales',
'Product Category'[Product Category Name] = "Bikes" ),
-- field to group by
Product[Product Name],
"Quantity sold",
SUM ( 'Internet Sales'[Order Quantity] )
)
SELECT
P.[Product Name],
SUM(Fact.[Quantity]) as 'Quantity sold'
FROM
(SELECT F.* FROM [Transaction] F
JOIN Category c ON F.[Category_Key] = C.[Category_Key]
WHERE C.[Product Category Name] = 'Bikes'
) Fact
join Product P ON P.[Product_Key] = Fact.[Product_Key]
GROUP BY
P.[Product Name]

上述的SQL语句有很多种写法。

高亮部分CalculateTable里面筛选了Bikes这个类别,正如SQL的sub Query一样。

DAX ADDCOLUMNS vs SQL Derived Column

注:ADDCOLUMNS跟Calculated Column类似:即给指定的表加入计算列。不一样的地方在于Addcolumn所加的只在它所在的语句有效。

 DAX  SQL
EVALUATE
ADDCOLUMNS (
'Product Category',
"Number transactions", COUNTROWS ( RELATEDTABLE ( 'Internet Sales' ) )
)
SELECT [Product Category Name], count(t.Id) AS 'Number transactions'
FROM Transaction F
JOIN [Product Category] C on F.[Category_Key] = C.[Category_Key]
GROUP BY
C.[Product Category Name]

小结:

DAX语法十分灵活,有些看起来晦涩难懂,但是,如果能够以SQL为基础的角度去切入会事半功倍。
还有,此文没有介绍的上下文(Filter Context)是一个重要的概念,如果要真正掌握DAX和一些高级的用法,深刻理解上下文是必须的。

希望有时间好好讲讲这个。

欢迎交流与骚扰

DAX基础入门 - 30分钟从SQL到DAX -- PowerBI 利器的更多相关文章

  1. TTS-零基础入门-10分钟教你做一个语音功能

    在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话  CreateObject("SAPI.SpVoice").Spea ...

  2. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  3. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. Objective-C 30分钟入门教程

    Objective-C 30分钟入门教程 我第一次看OC觉得这个语言的语法有些怪异,为什么充满了@符号,[]符号,函数调用没有()这个,但是面向对象的高级语言也不外乎类,接口,多态,封装,继承等概念. ...

  5. AngularJS 30分钟快速入门【译】

    引用自:http://www.revillweb.com/tutorials/angularjs-in-30-minutes-angularjs-tutorial/,翻译如下: 简介 我三年前开始使用 ...

  6. 【转载】20分钟MySQL基础入门

    原文:20分钟MySQL基础入门 这里持续更新修正 开始使用 MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格 ...

  7. LaTeX新人教程,30分钟从完全陌生到基本入门

    by Nan 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. 本教程面向对LaTeX完全无认知无基础的新人.旨在让新人能够用最简单快捷的方式,轻松入门,能够迅速使用LaTeX完成基本的文本 ...

  8. 正则表达式30分钟入门教程<转载>

    来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了 ...

  9. LaTeX新人30分钟从完全陌生到基本入门

    From:http://www.360doc.com/content/13/0117/11/2886802_260681908.shtml 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. ...

随机推荐

  1. C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)

    前言:大过年的,写篇文章不容易,还是给自己点个赞~~年前找了下.net安装包的制作方法,发现Visual Studio自带的制作工具使用起来非常麻烦,需要单独下载安装包,并且什么激活认证等等屁事相当麻 ...

  2. 通过java.net.URLConnection发送HTTP请求的方法

    一.前言 如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.UR ...

  3. javascript this的一些误解

    太拘泥于"this"的字面意思就会产生一些误解.有两种常见的对于this 的解释,但是它们都是错误的. 1.指向自身 人们很容易把this 理解成指向函数自身,这个推断从英语的语法 ...

  4. Asp.net mvc 知多少(七)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  5. DFS 分布式文件系统 选型笔记

    需求按优先级顺序如下: 1)存放3TB以上中小型文件,图片为主,平均在500~700k,一般在1M以内. 2)要集群化,支持负载均衡,高可用高性能.有大企业使用背书最好. 3)提供Java程序上传文件 ...

  6. ASP.NET MVC5 实现分页查询

    对于大量数据的查询和展示使用分页是一种不错的选择,这篇文章简要介绍下自己实现分页查询的思路. 分页需要三个变量:数据总量.每页显示的数据条数.当前页码. //数据总量 int dataCount; / ...

  7. selenium框架与chrome浏览器的不兼容问题

    在一次偶然的情况下,在chrome上用selenium框架去抓取某个id为XX的页面元素,使用WebDriver的findElement().click()方法进行点击,原来在firefox浏览器运行 ...

  8. 关于 <textarea ></textarea >标签在苹果微信浏览器出现 内阴影

    解决方法:(去除浏览器默认的样式元素) textarea  { box-shadow:0px 0px 0px rgba(0,0,0,0); -webkit-appearance:none; }

  9. devexpress设置系统全局字体(含工具栏字体)

    1.许多时候,都需要设置系统的字体.devexpress设置字体效果图比较如下: 上图比较可以看出,字体应用到了所有控件. 2.数据绑定代码: DataTable dt = new DataTable ...

  10. Linux 命令--查看物理CPU个数、核数、逻辑CPU个数

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...