POWER BI之DAX与SQL区别

简介:

前言:

这篇文章对于具有一点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] )
TOP3 = TOPN(3,SUMMARIZE('订单表','订单表'[create_time],"Sale Amount",sum('订单表'[amount])),[Sale Amount])   //返回表的值,需要添加表

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和一些高级的用法,深刻理解上下文是必须的。




本文转自 DBAspace 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/2048744
相关文章
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
10月前
|
SQL 搜索推荐 数据挖掘
一文详解报表工具和BI工具的区别
一文详解报表工具和BI工具的区别
|
7月前
|
SQL 数据库
|
8月前
|
SQL 存储 NoSQL
. NoSQL和SQL的区别、使用场景与选型比较
【7月更文挑战第30天】. NoSQL和SQL的区别、使用场景与选型比较
126 15
|
7月前
|
SQL 数据挖掘
|
7月前
|
SQL Java 数据库连接
|
9月前
|
分布式计算 DataWorks 大数据
MaxCompute产品使用合集之odps.sql.mapper.split.size和odps.stage.mapper.split.size这两个参数的区别是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
9月前
|
BI
Power BI获取SharePoint List列表后,如何展开List/Table中的字段,以及使用逗号拼接为一个字符串
在Power BI中,从SharePoint List获取数据时遇到Table和List混合的数据源,直接展开会导致“笛卡尔积”效应,生成过多行。目标是保持行数不变,将Table中的字段与List值用逗号分隔显示在同一行。解决方法包括:1) 添加新列,从Table中提取List的Column2值;2) 使用Text.Combine函数合并List中的值。具体操作步骤包括选择列并自定义新列,然后展开List并以逗号分隔。通过这些步骤,可以将Table转换为所需的字符串格式。完整的Power BI Query代码展示了这一过程。参考链接提供了更多详情。
173 2
|
10月前
|
SQL 存储 数据处理
实时计算 Flink版产品使用合集之flink-connector-mysql-cdc 和 flink-sql-connector-mysql-cdc有什么区别
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
498 1
|
SQL Java 数据库连接
MyBatis之动态SQL、#与$的区别和结果映射
MyBatis之动态SQL、#与$的区别和结果映射
142 0