zoukankan      html  css  js  c++  java
  • DAX基础入门

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

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

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

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

    前言:

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

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

    正文:

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

    • SUMMARIZE
    • FILTER
    • CALCULATE 与 CALTULATETABLE

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

    先来看一个例子,

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

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

     

    欢迎交流与骚扰

  • 相关阅读:
    《数据结构与算法分析:C语言描述》复习——第九章“图论”——最大流问题
    《数据结构与算法分析:C语言描述》复习——第九章“图论”——多源最短路径问题
    《数据结构与算法分析:C语言描述》复习——第九章“图论”——单源带权最短路径问题
    《数据结构与算法分析:C语言描述》复习——第九章“图论”——无权值的最短路径问题
    《数据结构与算法分析:C语言描述》复习——第九章“图论”——拓扑排序
    《数据结构与算法分析:C语言描述》复习——第七章“哈希”——哈希表
    毕业整一年
    存储管理学习笔记
    一个操作系统的实现学习笔记记录(1)
    6自由度空间机器人课程设计的简要记录
  • 原文地址:https://www.cnblogs.com/lizardbi/p/DAX-FOUNDATION-DAX-FOR-SQL-DEVELOPER-IN-30-MINUTES.html
Copyright © 2011-2022 走看看