POWER BI之DAX与SQL区别
看到漂漂亮亮的PowerBI报表,手痒痒怎么办?! 有没有面对着稀奇古怪的DAX而感到有点丈八金刚摸不着头脑或者干瞪眼?! 有没有想得到某个值想不出来DAX怎么写而直跳脚!? 看完这篇文章,你会恍然大悟,捂脸偷笑。呼呼呼~ ? 前言:这篇文章对于具有一点SQL查询基础人会十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等。 ?注:此文不涉及到Filter Context(筛选上下文)的介绍。 ?正文: 对于对SQL有一定了解的人来说,咋看DAX,怎么都不习惯。 但是,如果理解以下几个后,DAX学起来就得心应手一些。
注:这里不会对这些语法详细的讲解,而是从SQL的角度,看看那些DAX的等价相似语句。 ?先来看一个例子, 查询Products表里的所有行:? 表?='tblProduct' SELECT?*FROM?tblProduct ?[object?Object] DAX Filter vs SQL FilterDAX:
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和一些高级的用法,深刻理解上下文是必须的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |