精华内容
下载资源
问答
  • DAX函数入门知识

    2021-06-06 18:14:33
    DAX编程注释和快捷键 DAX函数分类介绍 关系传递和交叉筛选器方向 计算列和度量值及计算表的多种生成方式 数据类型和数据格式控制 Format函数自定义数据格式 DAX代码性能分析器 DAX函数实现特殊符号的使用 DAX函数...
  • DAX函数之Calculate函数

    2021-02-23 21:10:14
    DAX函数之Calculate函数: https://www.jianshu.com/p/d07b257d3590 语法: CALCULATE(,…) 第一个参数是计算表达式,可以执行各种聚合运算(或者含有聚合函数的度量值) 从第二个参数开始,是一系列筛选条件,可以...

    DAX函数之Calculate函数:

    https://www.jianshu.com/p/d07b257d3590

    语法:

    CALCULATE(,…)

    第一个参数是计算表达式,可以执行各种聚合运算(或者含有聚合函数的度量值)

    从第二个参数开始,是一系列筛选条件,可以为空;如果多个筛选条件,用逗号分隔

    重点:

    结合ALL函数,扩大上下文:

    ALL(‘产品明细’)的意思是清除产品明细表里的所有筛选,外部筛选器不起作用了,每行统计的都是该表中的所有产品。

    ALL函数简单理解为从整体中取筛选满足的表达式

    展开全文
  • DAX函数

    2020-11-23 09:02:16
    所以这时候筛选函数就有很大的价值了,在配合聚合,时间智能,迭代等函数,那么对数据的处理就游刃有余了。 在常见函数之前,我们要先了解DAX语法的结构。语法包含总成公式的不同元素。 语法包含以下元素: 等号...

    DAX框架:三个非常重要的基础概念,语法、函数和上下文。

    DAX度量值的工作原理就是筛选和计算。用于计算的函数和Excel有很多相似的,但Excel可以应用于单个单元格或行列,DAX只能引用完整的表或列。所以这时候筛选函数就有很大的价值了,在配合聚合,时间智能,迭代等函数,那么对数据的处理就游刃有余了。

    在常见函数之前,我们要先了解DAX语法的结构。语法包含总成公式的不同元素。
    语法包含以下元素:
    等号运算符(=)
    引用列 [列名] ,公式中的列引用用方括号[]括起来,与引用单元的Excel不同,DAX公式始终引用列
    数学运算符(+ - * / 等等)

    接下来看一个度量值公式:
    销售额总计 := SUM( FactSales [ SalesAmount ])
    度量值公式在度量值名称后面用冒号等号“:=”.
    FactSales 是一个引用表
    SalesAmount 是 FactSales表中 的一个列

    DAX相比于Excel,有以下几个独特点:

    • DAX函数始终引用完整的列或表,如果要引用表或列中特定的值,就需要向公式中添加筛选器
    • 如果需要逐行自定义计算,DAX函数可提供让你使用当前值或相关值作为一种参数来执行计算的函数(因上下文而异),所以就要了解上下文的相关信息
    • DAX包含的许多函数都将返回表,而不是返回值。表不会显示,它只会用于向其他函数提供输入。例如,你可以检索一个表,然后对表中的非重复数据进行计数;或者计算多个已筛选表或列的动态总和
    • DAX包含多种"时间智能"函数。利用这些函数,可以自定义选择日期范围,并基于它们做动态计算。

    上下文
    上下文是要了解的最重要的DAX概念之一。DAX中有两种上下文:行上下文,筛选上下文

    我们前面所说的计算列和度量值,都是在上下文中进行的。上下文这个概念非常使人迷惑,我们可以把 “上下文” 理解为 “环境” ,在特定环境下进行的计算。
    行上下文
    行上下文比较好理解,一般是计算列。例如 ‘’利润 = 价格-成本‘’
    筛选上下文
    如果我们在Excel中建立一个透视表,把度量值放到值的区域内,然后把需要的字段放到行/列的区域内,这样我们得到的透视表中的每个值都是行和列进行筛选后的一个结果值。
    这个概念如果放到DAX中,就是筛选上下文

    筛选函数
    有两个强大的筛选函数:CALCULATEFILTER
    CALCULARE(<计算式>,<筛选条件1>,<筛选条件2>,…)
    CALCULARE的局限性:CALCULARE函数里筛选条件的参数只能是[列]=固定值的方法,例如:求咖啡种类=”拿铁”, 价格>30的销售数量,CALCULATE(SUM(sales),[咖啡种类]=‘拿铁’,[价格]>30)。
    但是如果我们要求季度销售量超过200杯的分店的销售数量的总和就比较难
    FILTER
    FILTER是筛选函数,不是计算函数。所以公式返回的是一张表。所以无法单独使用,一般会和CALCULATE搭配使用,也可以和聚合函数搭配使用。例如:countrows(filter(表,筛选条件))来计算表的行数。
    FILTER函数的语法第一个参数使任意一张表,第二部分是筛选条件,筛选结果是TRUE/FALSE的表达式。
    例如 CALCULATE(SUM(sales),[咖啡种类]=‘拿铁’,[价格]>30) 用FILTER可以写成calculate(sum(sales),filter(‘咖啡数据’,[咖啡种类]=‘拿铁’&&[价格]>30))
    filter对所筛选的表进行逐行的横向扫描,针对每一行循环的执行设定的筛选程序,我们把这类工具叫做Iterator迭代函数SUMX等带有X的函数和Earlier函数都属于迭代函数。它们和其他函数的区别是工作的时候可以意识到它所指的是哪一行,我们把这个工作叫做创造行上下文

    ALL()函数
    返回表中所有的行和列,忽略任何的筛选器。
    应用场景:计算部分占总体的百分比,计算部分在总体中的排名
    场景1,计算各城市销售额的排名情况。
    错误公式:RANKX(‘销售记录’,sum(‘销售记录’[销售额]),DESC)
    上面的公式如果拉取出来结果显示的排名都为1
    在这里插入图片描述
    因为城市也对排名起到了筛选作用,上面公式的意思就是每个城市的销售额在这个城市中的排名情况。所以最后的结果都是1
    正确的公式是:RANKX(ALL(‘销售记录’[销售城市]),SUM(‘销售记录’[销售额]),DECS)
    在这里插入图片描述

    场景2,计算每个城市销售额占总销售额的百分比
    SUM(‘销售记录’[销售额])/CALCULATE(SUM(‘销售记录’[销售额]),ALL(‘销售记录’))

    如果城市上面再有一个大区层级,我们需要计算每个大区中每个城市的销售额百分比占比情况,公式是SUM(‘销售记录’[销售额])/CALCULATE(SUM(‘销售记录’[销售额]),ALL(‘销售记录’[销售城市]))
    区别是如果我们是以每个大区作为一个总体的100%,那么我们就要清除城市对数据的筛选作用,CALCULATE(SUM(‘销售记录’[销售额]),ALL(‘销售记录’[销售城市]))这个公式就是计算每个大区的销售总额,然后 每个城市销售总额/每个大区的销售总额 就得到结果了
    在这里插入图片描述

    ALLSELECTED(tablename|columnname)函数
    再想象一个场景,我只想看费城的销售额占费城、纽约、芝加哥的百分比,那么我们就需要ALLSELECTED这个函数了
    作用:从当前选择的行或列中清除上下文筛选器,同时保留其他上下文筛选器。
    按筛选占总体% = ‘销售记录’[销售金额]/CALCULATE(‘销售记录’[销售金额],ALLSELECTED(‘销售记录’))
    按筛选占分类% = ‘销售记录’[销售金额]/CALCULATE(‘销售记录’[销售金额],ALLSELECTED(‘销售记录’[销售城市]))

    在这里插入图片描述
    仅从值上来看,按筛选占分类%和分类占比%是相等的,但是意义却不尽相同,假如将切片器仅选中费城和纽约,那么此时的按筛选占分类%=费城销量156/(选中的东区城市销量:费城156)=100%,而分类占比依然是56.32%。

    由此可见,占比的定义变化多端,大有文章,要正确使用ALL(Table)或ALL (Column[, Column[, …]])和ALLSELECTED([tablename|columnname])函数。

    ALLEXCEPT(table,column[,column[,…]])函数
    作用:删除表中除已应用于指定列的筛选器之外的所有上下文筛选器。

    展开全文
  • DAX函数大全

    千次阅读 2017-11-12 13:38:00
    一、筛选函数 1、ALL函数:返回表中的所有行货返回列中的所有值,同时忽略可能已应用的任何筛选器,此函数可用于清除筛选器对表中的所有行创建计算,返回删除了筛选器的表或列的值 语法:ALL({<table>|<...

    针对PowerPivotDAX函数参考

    一、筛选函数

    1ALL函数:返回表中的所有行货返回列中的所有值,同时忽略可能已应用的任何筛选器,此函数可用于清除筛选器对表中的所有行创建计算,返回删除了筛选器的表或列的值

    语法:ALL({<table> | <column>[, <column>[, <column>[,…]]]})

    如:创建一个《度量值》

    订单额度 = SUMX(ALL('订单表'),'订单表'[amount])

    blob.png


    虽然X轴使用日期来统计,显示的依然是总额度,在不使用ALL函数的一个度量值

    订单额度2 = SUMX('订单表','订单表'[amount])

    blob.png

    没有使用ALL时候,时间筛选器就生效了,显示各日的总额。实际应用中可能会分析日订单和总额的比率:

    计算日订单和总额的比率 = sumx('订单表','订单表'[amount])/sumx(ALL('订单表'),'订单表'[amount])

     

    ALL (Column[, Column[, ]]) 删除表中指定列的所有筛选器,表中针对其他列的所有筛选器仍应用,创建一个度量值:

    订单额度 = SUMX('订单表','订单表'[amount])/CALCULATE(SUM('订单表'[amount]),ALL('订单表'[create_time],'订单表'[cancel_rent_time]))

     

    ALLEXCEPT(Table, Column1 [,Column2]...):删除表中所有上下文筛选器,但已应用于制定列的筛选器除外,创建一个度量值:

    订单额度 = SUMX('订单表','订单表'[amount])/SUMX(ALLEXCEPT('订单表','订单表'[create_time],'订单表'[rent_pay_time],'订单表'[deposit_withdraw_time]), '订单表'[amount])

     

    ALLSELECTED:选取需要字段过滤其他,只能添加一个参数,同时忽略选取字段的筛选器,其他已应用的筛选器仍然生效,选取的时间仍然创建度量值的表,创建一个度量值:

    订单额度 = SUMX('订单表','订单表'[amount])/CALCULATE(SUMX('订单表','订单表'[amount]),ALLSELECTED('订单表'[create_time]))

    blob.png

    对比没有allselectd的情况下的筛选

    blob.png

     

    ALLNOBLANKROW函数:从关系的父表中,返回除空白行之外的所有行,或某一列中除空白行之外的所有非重复值,并且忽略可能存在所有上下文的筛选器。

    语法:ALLNOBLANKROW(<table>|<column>)


    若选table要删除其所有上下文筛选器的表,列同理,创建一个度量值

    订单额度222 = CALCULATE(SUMX('订单表','订单表'[amount]),ALLNOBLANKROW('订单表'))

    Datekey是张时间的维度表和和订单表相关联

    ,选自己的表的时间,列出当前时间,

    blob.png


    使用时间维度表,维度表所有的时间都会显示一个同一个值

    blob.png

    2CALCULATE函数:计算由指定筛选器修改的上下文中的表达式,作为表达式的结果值返回。

    语法:CALCULATE(<expression>,<filter1>,<filter2>…)

    expression要进行计算的表达式

    filter1…N定义筛选器的布尔表达式或表表大师的逗号分隔的列表

    创建一个度量值:

    度量值1 = CALCULATE(SUMx('订单表','订单表'[amount]),'订单表'[status]=200)


     

    限制:不能引用度量值、不能使用CALCULATE嵌套、不能使用扫描表或返回任何函数及聚合函数

    订单额度 = CALCULATE(SUM('订单表'[amount]),(ALL('订单表')))

    blob.png

    CALCULATETABLE函数:在由给定筛选修改的上下文中计算表表达式,返回包含值得表,BPI中的建模点新建表,此时不能使用新建度量值。

    语法: CALCULATETABLE(<expression>,<filter1>,<filter2>,…)
    度量值cal = CALCULATETABLE('订单表','订单表'[status]=100)


    新度量值 = SUMX(CALCULATETABLE('订单表','PowerBi 时间维度表'[DayOfMonthFull]="18"),'订单表'[amount])

    此时嵌套在聚合函数里,返回值的列表

     blob.png


    此时说明表达式返回表的多列值,只是根据条件过滤不匹配status=100de

     

    3DISTINCT:返回一列构成的一个表,该表包含来自指定列的非重复值,一般配合其他聚合函数来使用

    语法:DISTINCT(<column>)

    度量值cal = COUNTROWS(DISTINCT('订单表'[status]))

     

    4EARLIER函数:返回提及的列的外部计算传递中指定列的当前值(在想要使用某个值作为输入并且基于该输入进行计算的嵌套计算中)

    官档案例

    = COUNTROWS(FILTER(ProductSubcategory, EARLIER(ProductSubcategory[TotalSubcategorySales])<ProductSubcategory[TotalSubcategorySales]))+1


     

    5EARLIEST函数:返回指定列的外部计算传递中制定列的当前值,与4类似

    6、FILTER函数:返回表示另一个表达式的子集的表,只包含筛选行的表返回值
    语法:FILTER(<table>,<filter>)
    参数:
    table要筛选的表,表还可以是产生的结果集是表的表达式
            Filter为该表的每一行计算的布尔表达式
       FILTERS:返回直接作为筛选器应用于columnName的值
       HASONEFILTER:当columnName上的直接筛选值得数目为一个值,返回TRUE否则返回FALSE


         HASONEVALUE:已将columnName的上下文筛选为只剩下一个非重复值时返回TRUE,否则FALSE

     

    7RELATED函数:从另一个表返回相关值,与当前行相关的单个值

    语法:RELATED(<column>)
    ##


    RELATED 函数要求当前表与包含相关信息的表之间存在关系。您需要指定包含所需数据的列,该函数将通过现有的多对一关系从相关表中的指定列中提取值

    FILTER_RELATED_1 = SUMX(FILTER('订单表',RELATED('订单表状态维度表'[status_id])=101),'订单表'[amount])


    blob.png

    通过通过计算累计101值得累计和


    8RELATEDTABLE函数:由给定筛选器修改的上下文中计算表表达式,返回包含值得表

    语法: RELATEDTABLE(<expression>,<filter1>,<filter2>,…)
    注释


    RELATEDTETABLE 函数将更改筛选数据的上下文,并在您指定的新上下文中计算表达式。对于在筛选器参数中使用的每一列,将删除该列上的现有筛选器,改为应用在筛选器参数中使用的筛选器

    ###此函数是 CALCULATETABLE 函数的同义词


    9VALUES函数:返回由一列构成的一个表,包含来自制定列的非重复值。

    语法:values(<column>)

    注释

    当您在已筛选的上下文(例如数据透视表)中使用 VALUES 函数时,VALUES 返回的唯一值会受到筛选器的影响。例如,如果您按 Region 进行筛选,并且返回针对 City 的值列表,则该列表将只包括筛选器允许的区域中的那些城市。若要返回所有城市,而不管现有筛选器的情况如何,您必须使用 ALL 函数从表中删除筛选器。第二个示例演示如何将 ALL VALUES 一起使用。

    VALUES_1 = COUNTROWS(VALUES('订单表'[id] ))

    blob.png

     

    统计函数(聚合函数):对值得聚合运算,在筛选函数中已经应用部分,其他类似

     

    AVERAGE(<column>)
    AVERAGE(<column>):返回列中值的平均值(算术平均值)。处理文本和非数字值
    AVERAGEX(<table>,<expression>):计算对表进行求值的一组表达式的平均值(算术平均值)
    COUNTA (<column>)函数计算列中不为空的单元的数目。它不仅对包含数值的行进行计数,还对包含非空白值(包括文本、日期和逻辑值)的行进行计数
    COUNTAX 函数用于在对表计算表达式的结果时统计非空结果数。即,它的作用与 COUNTA 函数类似,但它用于对表中所有行进行循环访问,并统计指定表达式计算为非空结果的行数
    COUNTAX(<table>,<expression>)
    COUNTBLANK(<column>)  计算列中空白单元的数目
     
    COUNTROWS函数:计算制定表中的行数,或计算表达式定义的表中的行数
    语法:COUNTROWS(<TABLE>)
    COUNTX(<table>,<expression>)在对表计算表达式的结果时,计算包含数字或者计算结果为数字的表达式的行的数目
    MAX
    MAXA 返回列中的最大值。逻辑值和空白被计算在内MAXA(<column>)  MINA
    MAXX为表的每一行计算表达式,并且返回最大的数值MAXX(<table>,<expression>) MINX


     

     

    逻辑函数:
    AND函数:检查是否两个参数均为TRUE
    语法:AND(<LOGICAL1>,<LOGICAL2>)


    注释

    DAX 中的 AND 函数只接受两 (2) 个参数。如果您需要对多个表达式执行 AND 运算,则可以创建一系列计算;但更好的选择是,使用连接运算符 (&&) 在一个更简单的表达式中连接所有这些列

     
    FALSE函数:返回逻辑值FALSE
    语法:FALSE()
     
    IF函数:检查是否满足作为第一个参数提供的条件,满足为TRUE,否则为FALSE
    语法: IF(logical_test>,<value_if_true>, value_if_false)


    参数

    术语

    定义

    logical_test

    计算结果可以为 TRUE 或 FALSE 的任何值或表达式。

    value_if_true

    在逻辑测试为 TRUE 时返回的值。如果省略,则返回 TRUE。

    value_if_false

    在逻辑测试为 FALSE 时返回的值。如果省略,则返回 FALSE。

    =IF([Calls]<200,"low",IF([Calls]<300,"medium","high"))
    EGG:
    新增列IF = IF([status]=101, "已付押金",IF([status]=200, "租赁中",IF([status]=300, "待付租金",IF([status]=400, "已付租金",IF([status]=500, "未退押金",
        IF([status]=600, "交易失败",IF([status]=700,"申诉中" ,"取消"
    )))))))
    他的另外一种简洁语法:
    列SWITCH = SWITCH([status],101,"已付押金",200,"租赁中",300,"待付租金",400,"已付租金",500,"未退押金",600,"交易失败",700,"申诉中","取消")


    blob.png

    注释

    如果省略了 value_if_true  value_if_false 的值,则 IF 将其视为空字符串值 ("")

    如果在表达式中引用的值是某一列,则 IF 将返回与当前行相对应的值

    IF 函数尝试返回列中的单个数据类型。因此,如果 value_if_true  value_if_false 返回的值属于不同的数据类型,则 IF 函数会隐式转换数据类型以便适合列中的这两种值。例如,公式 IF(<condition>,TRUE(),0) 返回由 1  0 组成的列,并且可以对结果求和,但公式 IF(<condition>,TRUE(),FALSE()) 只返回逻辑值

    IFERROR函数:对某一表达式进行计算,并且如果该表达式返回错误则返回指定值,否则返回该表达式本身的值
    语法:IFERROR(value,value_if_error)##返回值类型要相同
    =IFERROR(25/0,9999)
    NOT函数:将FALSE改成TRUE,或者将TRUE改成FALSE
    语法:NOT(<logical>)
    OR函数 OR(<logical1>,<logical2>)
    IF(   OR(   CALCULATE(SUM('ResellerSales_USD'[SalesAmount_USD]), 'ProductSubcategory'[ProductSubcategoryName]="Touring Bikes") > 1000000
             ,   CALCULATE(SUM('ResellerSales_USD'[SalesAmount_USD]), 'DateTime'[CalendarYear]=2003) > 2500000
             )
       , "Circle of Excellence"
       , ""
       )
    TRUE函数:  语法:TRUE()


    = IF(SUM('InternetSales_USD'[SalesAmount_USD]) >200000, TRUE(), false())

     

     

     
    文本函数:
    BLAN()   返回空白。
    CONCATENATE:将两个文本字符串连接成一个文本字符串
    = CONCATENATE(sumx('订单表','订单表'[amount])/sumx(ALL('订单表'),'订单表'[amount]),"%")
    EXACT函数:比较字符串,相同为TRUE
    EXACT(<TEXT1>,<TEXT2>)
    FIND函数: 返回一个文本字符串在另一文本字符串中的开始位置。FIND 区分大小写。
    FIND(<find_text, within_text, start_num)


    参数

    定义

    find_text

    您要查找的文本。使用双引号(空文本)可以匹配 within_text 中的第一个字符;不允许通配符。

    within_text

    包含要查找的文本的文本。

    start_num

    从其开始进行搜索的字符;如果省略,start_num = 1。within_text 中的第一个字符是字符编号 1。

    FIXED函数: 将数字舍入到指定的小数位数,并以文本形式返回结果。可以指定以带或不带逗号的形式返回结果
    将数字舍入到指定的小数位数,并以文本形式返回结果。可以指定以带或不带逗号的形式返回结果


    参数

    定义

    number

    要舍入并转换为文本的数字,或包含数字的列。

    decimals

    (可选)小数点右侧的位数;如果省略,则为 2。

    no_commas

    (可选)一个逻辑值:如果为 1,则不在返回的文本中显示逗号;如果为 0 或省略,则在返回的文本中显示逗号。

    FORMAT函数:根据指定的格式转换为文本
    FORMAT(<value>, <format_string>)


    参数

    术语

    定义

    value

    值或计算结果为单个值的表达式。

    format_string

    具有格式模板的字符串。

    FORMAT函数的预定义数字格式


    下表标识预定义数字格式的名称。可按名称将它们用作 Format 函数的样式参数。

    格式规范

    说明

    "General Number"

    显示不带千位分隔符的数字。

    "Currency"

    显示带千位分隔符的数字(如果适用);显示小数点分隔符右侧两位。输出基于系统区域设置。

    "Fixed"

    小数点分隔符左侧至少显示一位,右侧显示两位。

    "Standard"

    显示带千位分隔符的数字,其中小数点分隔符左侧至少有一位,右侧有两位。

    "Percent"

    将数字乘以 100 后显示,并在紧右侧追加百分号 (%);小数点分隔符右侧总是显示两位。

    "Scientific"

    使用标准的科学记数法,并且提供两个有效位数。

    "Yes/No"

    如果数字为 0,则显示 No;否则显示 Yes。

    "True/False"

    如果数字为 0,则显示 False;否则显示   True。

    "On/Off"

    如果数字为 0,则显示 Off;否则显示 On。


     
    FORMAT函数的自定义数字格式


    用户定义的数字格式表达式可以包含一至三个部分(各部分之间用分号分隔)。如果 Format 函数的 Style 参数包含预定义的数字格式之一,则只允许有一部分。

    如果您使用

    则结果为

    只有一部分

    格式表达式应用于所有值。

    两部分

    第一部分应用于正值和零;第二部分应用于负值。

    三部分

    第一部分应用于正值,第二部分应用于负值,第三部分应用于零。

    格式规范

    下表标识了可用于创建用户定义的数字格式的字符。

    格式规范

    说明

    显示不带格式的数字。

    0(零字符)

    数字占位符。显示一个数字或一个零。如果表达式在格式字符串中出现零的位置有一个数字,则显示该数字,否则在该位置显示一个零。

    如果数字的位数少于格式表达式中零的个数(不管在小数点的哪一侧),将显示前导零或尾随零。如果小数点分隔符右侧的数字位数多于格式表达式中小数点分隔符右侧的零的个数,将对数字四舍五入,使其小数位数与零的个数一样多。如果小数点分隔符左侧的数字位数多于格式表达式中小数点分隔符左侧的零的个数,则将显示多出的位数而不作任何修改。

    #

    数字占位符。显示一个数字或不显示任何内容。如果表达式在格式字符串中出现 # 字符的位置有一个数字,则显示该数字,否则该位置什么也不显示。

    除了当数字的位数少于格式表达式中小数点分隔符任意一侧的 # 字符数时不显示前导零或尾随零外,该符号的作用类似于零 (0) 数字占位符。

    .(圆点字符)

    小数点占位符。小数点占位符确定在小数点分隔符左侧和右侧显示几位数。如果格式表达式中该符号的左侧只包含 # 字符,则小于 1 的数字以小数点分隔符开头。若要显示随小数显示的前导零,请使用零作为小数点分隔符左侧的第一个数字占位符。在某些区域设置中,用逗号作为小数点分隔符。在格式化输出中用作小数点占位符的实际字符取决于系统所识别的数字格式。因此,在您的格式中应将句点用作小数点占位符,即使您位于使用逗号作为小数点占位符的区域设置中。格式化字符串将以适合区域设置的正确格式显示。

    %

    百分比占位符。将表达式乘以 100。在格式字符串中出现百分比字符的位置插入百分比字符 (%)。

    ,(逗号字符)

    千位分隔符。千位分隔符将在小数点分隔符左侧具有四位或更多位数的数字中的千位和百位分隔开。如果格式包含一个由数字占位符(0 或 #)包围的千位分隔符,则指定千位分隔符的标准用法。

    一个千位分隔符紧挨小数点分隔符的左侧(无论是否指定小数)或者作为字符串中最右侧的字符表示“通过除以 1000 来将数字按比例减小,并按需要四舍五入”。小于 1,000 但大于或等于   500 的数字显示为 1,小于 500 的数字显示为 0。此位置有两个相邻千位分隔符表示按一百万倍的比例因子缩小,并且每增加一个分隔符表示另外缩小 1,000 倍。

    多个分隔符出现在紧挨小数点分隔符左侧或字符串最右侧位置被视为指定使用千位分隔符。在某些区域设置中,用句点作为千位分隔符。在格式化输出中用作千位分隔符的实际字符取决于您的系统所识别的数字格式。因此,在您的格式中应将逗号用作千位分隔符,即使您位于使用句点作为千位分隔符的区域设置中。格式化字符串将以适合区域设置的正确格式显示。

    例如,考虑以下三个格式字符串:

    “#,0.”,该字符串使用千位分隔符将数字一亿的格式设置为字符串“100,000,000”。

    “#0,.”,该字符串按 1000 的因子进行缩小,将数字一亿的格式设置为字符串“100000”。

    “#,0,.”该字符串使用千位分隔符和按 1000 的因子进行缩小,将数字一亿的格式设置为字符串“100,000”。

    :(冒号字符)

    时间分隔符。在某些区域设置中,可能用其他字符表示时间分隔符。在设置时间值的格式时,时间分隔符用于分隔小时、分钟和秒。在格式化输出中用作时间分隔符的实际字符取决于您的系统设置。

    /(正斜杠字符)

    日期分隔符。在某些区域设置中,可能用其他字符表示日期分隔符。在设置日期值的格式时,日期分隔符用于分隔年、月和日。在格式化输出中用作日期分隔符的实际字符取决于您的系统设置。

    E-E+e-e+

    科学记数法格式。如果格式表达式在 E-、E+、e- 或 e+ 的左侧至少包含一个数字占位符(0 或 #),则以科学记数法格式显示数字,并在数字与其指数之间插入 E 或 e。左侧的数字占位符的个数决定了指数中的数字个数。使用 E- 或 e- 可在负指数的后面放置一个减号。使用 E+ 或 e+ 可在负指数的后面放置一个减号,在正指数的后面放置一个加号。还必须在该符号右侧包括数字占位符以获取正确的格式。

    - + $ ( )

    文字字符。这些字符将完全按格式字符串中所键入的形式显示。若要显示所列字符以外的其他字符,请在该字符前加上一个反斜杠 (\) 或将该字符放在双引号 (" ") 中。

    \(反斜杠字符)

    显示格式字符串中的下一个字符。若要将具有特殊含义的字符显示为文字字符,请在该字符前加上一个反斜杠 (\)。反斜杠本身不显示。使用反斜杠与将下一个字符放在双引号中的作用是相同的。若要显示反斜杠,请使用两个反斜杠 (\\)。

    不能显示为文字字符的字符示例为日期格式字符和时间格式字符(a、c、d、h、m、n、p、q、s、t、w、y、/ 和 :)、数字格式字符(#、0、%、E、e、逗号和句点)和字符串格式字符(@、&、<、> 和 !)。

    "ABC"

    显示双引号 (" ") 里面的字符串。若要将字符串包含在代码内的样式参数中,必须将文本放在 Chr (34) 之间(34 为引号 (") 的字符代码)。

    下表包含用于表示数字的一些示例格式表达式。(所有这些示例均假设您的系统区域设置为“英语 - 美国”)第一列包含 Format 函数的格式字符串;如果格式化的数据具有在列标题中给定的值,则其他列包含生成的输出结果。

    格式(样式)

    “5”格式设置为

    “-5”格式设置为

    “0.5”格式设置为

    “0”格式设置为

    零长度字符串 ("")

    5

    -5

    0.5

    0

    0

    5

    -5

    1

    0

    0.00

    5.00

    -5.00

    0.50

    0.00

    #,##0

    5

    -5

    1

    0

    $#,##0;($#,##0)

    $5

    ($5)

    $1

    $0

    $#,##0.00;($#,##0.00)

    $5.00

    ($5.00)

    $0.50

    $0.00

    0%

    500%

    -500%

    50%

    0%

    0.00%

    500.00%

    -500.00%

    50.00%

    0.00%

    0.00E+00

    5.00E+00

    -5.00E+00

    5.00E-01

    0.00E+00

    0.00E-00

    5.00E00

    -5.00E00

    5.00E-01

    0.00E00

    "$#,##0;;\Z\e\r\o"

    $5

    $-5

    $1

    注释

    如果包含两个连续的分号,则缺少的部分用正值的格式显示。

    预定义日期和时间格式:


    下表标识预定义的日期和时间格式的名称。如果您使用这些预定义的字符串之外的字符串,它们将作为自定义日期和时间格式来解释。

    格式规范

    说明

    "General Date"

    显示日期和/或时间。例如 3/12/2008 11:07:31 AM。日期显示由您的应用程序的当前区域性值确定。

    "Long Date" 或者"Medium   Date"

    根据您的当前区域性的长日期格式显示日期。例如,2008 年 3 月 12 日,星期三。

    "Short Date"

    使用您的当前区域性的短日期格式显示日期。例如 3/12/2008。

    "Long Time" 或者"Medium   Time"

    使用您的当前区域性的长时间格式显示时间;通常包括小时、分钟和秒。例如,11:07:31 AM。

    "Short Time"

    使用您的当前区域性的短时间格式显示时间。例如,11:07 AM。

    FORMAT函数自定义日期和时间格式:


    下表显示可用于创建用户定义的日期/时间格式的字符。

    格式规范

    说明

    (:)

    时间分隔符。在某些区域设置中,可能用其他字符表示时间分隔符。在设置时间值的格式时,时间分隔符用于分隔小时、分钟和秒。在格式化输出中用作时间分隔符的实际字符取决于您应用程序的当前区域性值。

    (/)

    日期分隔符。在某些区域设置中,可能用其他字符表示日期分隔符。在设置日期值的格式时,日期分隔符用于分隔年、月和日。在格式化输出中用作日期分隔符的实际字符取决于您应用程序的当前区域性。

    (%)

    用于指示应以单个字母格式读取后面的字符,而不考虑任何尾随字母。此外,还用于指示以用户定义的格式读取单个字母格式。有关其他详细信息,请参阅以下内容。

    d

    将天显示为不带前导零的数字(例如,1)。如果这是用户定义的数字格式中的唯一字符,则使用 %d。

    dd

    将天显示为带一个前导零的数字(例如,01)。

    ddd

    将天显示为缩写(例如,Sun)。

    dddd

    将天显示为全名(例如,Sunday)。

    M

    将月显示为不带前导零的数字(例如,一月表示为 1)。如果这是用户定义的数字格式中的唯一字符,则使用 %M。

    MM

    将月显示为带一个前导零的数字(例如,01/12/01)。

    MMM

    将月显示为缩写(例如,Jan)。

    MMMM

    将月显示为完整的月份名称(例如,January)。

    gg

    显示时期/时代字符串(例如,A.D.)。

    h

    使用 12 小时制时钟将小时显示为不带前导零的数字(例如,1:15:15 PM)。如果这是用户定义的数字格式中的唯一字符,则使用 %h。

    hh

    使用 12 小时制时钟将小时显示为带前导零的数字(例如,01:15:15 PM)。

    H

    使用 24 小时制时钟将小时显示为不带前导零的数字(例如,1:15:15)。如果这是用户定义的数字格式中的唯一字符,则使用 %H。

    HH

    使用 24 小时制时钟将小时显示为带前导零的数字(例如,01:15:15)。

    m

    将分钟显示为不带前导零的数字(例如,12:1:15)。如果这是用户定义的数字格式中的唯一字符,则使用 %m。

    mm

    将分钟显示为带前导零的数字(例如,12:01:15)。

    s

    将秒显示为不带前导零的数字(例如,12:15:5)。如果这是用户定义的数字格式中的唯一字符,则使用 %s。

    ss

    将秒显示为带前导零的数字(例如,12:15:05)。

    f

    显示秒的小数部分。例如,ff 显示百分之一秒,而 ffff 显示万分之一秒。在用户定义的格式中最多可以使用 7 个 f 符号。如果这是用户定义的数字格式中的唯一字符,则使用 %f。

    t

    使用 12 小时制时钟,对于中午之前的任何小时都显示大写字母 A;对于中午与 11:59 P.M 之间的任何小时都显示大写字母 P。如果这是用户定义的数字格式中的唯一字符,则使用 %t。

    tt

    对于使用 12 小时制时钟的区域设置,对中午之前的任何小时都显示大写字母 AM;对于中午与 11:59 P.M 之间的任何小时都显示 PM。

    对于使用 24 小时制时钟的区域设置,不显示任何内容。

    y

    将年显示为不带前导零的数字 (0-9)。如果这是用户定义的数字格式中的唯一字符,则使用 %y。

    yy

    以带一个前导零的两位数字格式显示年(如果适用)。

    yyy

    以四位数字格式显示年。

    yyyy

    以四位数字格式显示年。

    z

    显示不带前导零的时区偏移量(例如,-8)。如果这是用户定义的数字格式中的唯一字符,则使用 %z。

    zz

    显示带一个前导零的时区偏移量(例如,-08)

    zzz

    显示完整的时区偏移量(例如,-08:00)

    注释

    格式设置字符串区分大小写。使用不同的大小写形式,可以获取不同的格式。例如,当使用字符串“D”格式化日期值时,可以获得采用长格式的日期(根据您的当前区域设置)。但是,如果将此字母更改为小写“d”,则可以获得采用短格式的日期。此外,如果目标格式与任何定义的格式字符串的大小写都不匹配,则可能出现意外结果或错误。

    日期/时间格式使用当前用户区域设置来确定字符串的最终格式。例如,若要使用下列格式字符串“M/d/yyyy”来设置日期 1995 年 3 月 18 日,如果用户区域设置为美国 (en-us),则结果为“3/18/1995”;但如果用户区域设置为德国 (de-de),则结果为“18.03.1995”

    LEFT函数:从文本字符串的开头返回指定数据的字符--- RIGHT(<text>, <num_chars>)
     
    LEFT(<text>, <num_chars>)
    LEN(<TEXT>)
    LOWER(<TEXT>)      ….UPPER


    REPLACE 将基于您指定的字符数,用不同的文本字符串替换文本字符串的一部分。

    语法

    REPLACE(<old_text>, <start_num>, <num_chars>, <new_text>)


    REPT:重复给定次数的文本。使用 REPT 可用一个文本字符串的许多实例填充单元格。

    语法

    REPT(<text>, <num_times>)
    SEARCH:返回最先找到特定字符或文字字符串的位置的字符编号


    语法

    SEARCH(<find_text>, <within_text>, [start_num])
    SUBSTITUTE:用文本字符中的新文本替换现有文本。


    语法

    SUBSTITUTE(<text>, <old_text>, <new_text>, <instance_num>)
    TRIM:从文本删除两个词之间除了但哥空格外的所有空格


    语法

    TRIM(<text>)
    VALUE:将表示数字的文本字符串转为数字


    语法

    VALUE(<text>)


     

     

    DAXMySQL语法的比较。

    1、  查看表的所有行记录

    Select * from tb_product_order

    DAX:  = '订单表'     //返回的表的记录,不能使用新建度量值方法,

    blob.png

    需《建模》--新表

    blob.png

     

    2、  单表过滤条件,在关系型数据库里使用WHERE XX=”OO”

    SELECT * FROM tb_product_order  WHERE STATUS=100

    DAX:  = FILTER('订单表','订单表'[status]=100)


     blob.png

    3、多表JOIN连接(左外连接)

    SQL:

    SELECT tbp.* FROM tb_product_order  tbp

    LEFT JOIN dim_renttpye dimr

    ON tbp.type=dimr.id WHERE dimr.id=1

    blob.png

    DAX:

     = FILTER('订单表',RELATED('商品消费方式'[id])=1)

    blob.png

     

     

    4、单表维度使用分组GROUP BY

    SELECT `type`,COUNT(`type`) FROM tb_product_order  tb GROUP BY `type`

    blob.png

    DAX:

     = GROUPBY('订单表','订单表'[type],"AAA",COUNTAX(CURRENTGROUP(),'订单表'[type]))

    blob.png

    5、获取前几个最大或最小的值

    SELECT amount,DATE(create_time) FROM tb_product_order ORDER BY amount ASC LIMIT 3

    blob.png

    DAX:

     = TOPN(3,'订单表','订单表'[amount],ASC)

    blob.png

     

    以上通过简单的应用返回包含值得表。

    返回包含值得表的限制:

    1、  表达式不能引用度量值

    2、  表达式不能使用嵌套CALCULATE函数

    3、  表达式不能使用扫描表或返回表的任何函数,包括聚合函数

     

     

    DAX一些其他函数使用

    度量值:

    统计状态分组数据
    度量值SWICH = sumx('订单表',SWITCH([status],101,'订单表'[amount],200,'订单表'[amount],300,'订单表'[amount],400,'订单表'[amount],500,'订单表'[amount],600,'订单表'[amount],700,'订单表'[amount],'订单表'[amount]))


    blob.png

    度量值 = SUMMARIZE(CALCULATETABLE('用户表',FORMAT('用户表'[create_time],"yyyy")="2017"),'用户表'[city],'用户表'[county],"total_count",COUNT('用户表'[user_id]))


     

    累计注册用户数 = IF(

            MAX('PowerBi 时间维度表'[DateKey].[Date])<TODAY(),

            CALCULATE(COUNT('用户表'[user_id]),FILTER(ALLSELECTED('PowerBi 时间维度表'[DateKey]),'PowerBi 时间维度表'[DateKey] <= MAX('PowerBi 时间维度表'[DateKey]))))

    ##返回表,函数嵌套

    AA := FILTER(SUMMARIZE('订单表', '订单表'[product_id],'订单表'[create_time],"销售总额",sum('订单表'[amount])),[销售总额]<>0)




    本文转自 DBAspace 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/2050922
    展开全文
  • 总结一下Filter函数的使用。 Staff表数据如下: 1. 使用多个FILTER实现嵌套筛选

    总结一下Filter函数多个筛选条件的使用。

    Staff表所有数据如下:

    1. 使用多个FILTER实现嵌套筛选

    第一层筛选的是Department为“开发”的人员,第二层筛选Province是“广东省”的人员:

    2. 在FILTER中使用AND和OR实现多条件筛选

    效果跟上面是一样的,但是AND函数参数只能为2个。同时满足两个条件的才会被筛选出来

    使用OR,只要满足Department为“开发”或者Province为“广东省”的数据即被筛选出来,

    跟AND一样,OR参数也只能为2个。

    3. 在FILTER中使用IN函数筛选数据

    筛选出Department为开发、运维的人员。

    组合使用:

    展开全文
  • PowerPivot的DAX函数实战

    万次阅读 2017-12-15 09:28:19
    一、筛选函数 1、ALL函数:返回表中的所有行货返回列中的所有值,同时忽略可能已应用的任何筛选器,此函数可用于清除筛选器对表中的所有行创建计算,返回删除了筛选器的表或列的值 语法:ALL({ | [, [, [,…]]]}) 如...
  • 函数的作用是判断ColumnName 是否被交叉筛选,当满足下面三点中任意一点时,该值返回True: 参数columnName 被筛选时 同一张表中的其他列 被筛选时 扩展表(related table) 被筛选时 所以,本篇文章从上述三点来...
  • DAX函数: calculate

    2020-01-23 20:23:51
    在指定筛选器所修改的上下文中对表达式进行求值。 个人理解:类似于一个Excel中的 if 函数函数结构: CALCULATE(< expression >,< filter1 >,< filter2 >…) 参数汉译:(表达式,执行条件) 可...
  • Power Bi:DAX函数总结

    千次阅读 2020-05-04 15:04:33
    文章目录信息函数关系函数日期与时间函数筛选函数逻辑判断函数逻辑函数统计函数文本函数 信息函数 关系函数 日期与时间函数 1.计算年初至今累计--TOTALYTD函数 例如计算年初至今累计的销售金额: [年累计金额]...
  • 版权声明:本文为博主原创文章,未经博主允许不得转载...一、筛选函数 1、ALL函数:返回表中的所有行货返回列中的所有值,同时忽略可能已应用的任何筛选器,此函数可用于清除筛选器对表中的所有行创建计算,返回删...
  • 本篇文章详细讲解了除ALLSELECTED外的其余ALL类函数的详细用法,如果你对ALL类函数的行为感到不解的话,不妨点进来看下,绝对能让你有所收获!
  • DAX中的ALL函数

    千次阅读 2018-09-06 13:22:08
    ALL函数筛选器类型函数中比较特殊的一个函数。使用ALL函数的目的正好与FILTER函数相反,这个函数的功能是可以去除指定表单或列上应用的筛选器,让表单或者列中的所有数据都可以作为函数运算的上下文来参与计算。 ...

空空如也

空空如也

1 2 3 4 5
收藏数 87
精华内容 34
关键字:

dax筛选函数