加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

POWER BI之DAX与SQL区别

发布时间:2020-12-14 04:54:04 所属栏目:大数据 来源:网络整理
导读:看到漂漂亮亮的PowerBI报表,手痒痒怎么办?! 有没有面对着稀奇古怪的DAX而感到有点丈八金刚摸不着头脑或者干瞪眼?! 有没有想得到某个值想不出来DAX怎么写而直跳脚!? 看完这篇文章,你会恍然大悟,捂脸偷笑。呼呼呼~ ? 前言: 这篇文章对于具有一点SQL

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

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

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

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

?

前言:

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

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

?正文:

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

  • SUMMARIZE

  • FILTER

  • CALCULATE 与?CALTULATETABLE

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

?先来看一个例子,

查询Products表里的所有行:?

表?='tblProduct'

SELECT?*FROM?tblProduct

?[object?Object]

DAX Filter vs SQL Filter

DAX:

FILTER?(
????Product,????RELATED?(?Category[Product?Category?Name]?)?=?"Bike")

SQL:

SELECT?*?FROM?Product?PJOIN?Category?c?on?P.[Category_KEY]?=?c.[Category_KEY]WHERE
????c.[Product?Category?Name]?=?'Bikes'

FILTER是一个MUST?know的语句

?

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

DAX

--?显示每个产品销售数目
SUMMARIZE?('Transaction','Transaction'[ProductId],"Total?qty",?SUM?(?'Transaction'[Quantity]?)
)
--?显示每个产品销售数目
(Quantity)???
??ProductId

?

SUMMERIZE

选择一个表中指定的列:

dax

SUMMARIZE(
Product,Product[Name],Product[Size])

?

SELECT?Name,Size
FROM?tblProduct

选择前几行:


TOPN?(?5,?Product,?Product[FullPrice]?)
select?*?from?Product????LIMIT?5

SUMMARIZE是一个比较重要语句:

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

?

复制代码

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

复制代码

?再来一个例子:

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

MSDN的例子

DAX:

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]?FJOIN?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]

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

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

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

CALCULATETABLE vs Sub Query

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读