DAX 一般用于在PP中建模,以时间为应用单元,对月日年季度不断操作,达到数据分析的目的。可以百度其真正的应用场景。在实际应用之前最好是先创建一张日期格式表,并于要分析的数据源表进行关联,即创建对应的关系
先将excel中的数据添加到数据模型,如果数据已经导入,则省略。然后就可以点开度量值的控件按钮进行编写了,哦度量值不同于字段,字段可以理解为数据的列,而度量值是在列的基础上进行的某些操作,比如说聚合函数。其一般也不直接显示在表里面,而是作为一个筛选条件存在于数据透视表里面,也就是说,要先懂数据透视表,然后才能懂度量值,其更像sql语句一样灵活,解决数据透视表无法表达的却又有的内涵。
CLOSINGBALANCEMONTH():计算当前上下文中该月最后一个日期的expression语法CLOSINGBALANCEMONTH(表达式,日期格式[,筛选条件])
下面的公式示例创建一个度量值,该度量值计算产品库存的“月末库存值”。为了阐释此示例的工作方式,创建一个数据透视表,并且向该数据透视表的“行标签”区域添加三个字段:CalendarYear、MonthNumberOfYear 和 DayNumberOfMonth。 然后使用在代码部分中定义的公式,将名为 Month End Inventory Value 的度量值添加到该数据透视表的“值”区域。代码
=CLOSINGBALANCEMONTH(SUMX(ProductInventory,ProductInventory[UnitCost]*ProductInventory[UnitsBalance]),DateTime[DateKey])
这个是文档里面复制的,我不知道是不是我理解有问题,这里的月末库存值是指这个月月末那天库存物的价值,我把它和会计里面那个联系起来,好像期末库存余额(其实不是),对公式进行一下解读,汉语翻译一下意思吧。表达式的名称(所应用的表的名字,表名[字段名]运算操作符 表名[表字段名]),表名[字段名])。。。其实可以看出如果是设计多张表要在函数后面加X,如SUMX,AVERAGEX等,在写字段的时候一般写出第一个字母就会有智能感知的提示,鼠标双击就可以选取,如果是对同一张表操作,可以省略字段前的表名,字段名被括在中括号里面,这是固定的表达式的书写规范。写好这个度量值之后,在数据透视表里面勾选并拖到值,就完成了其的使命,其实对于简单的聚合函数,完全可以用透视表的鼠标来完成,没必要搞得这么复杂,还专门写个度量值。我也是最近才初学,好多东西都是自己直观的理解,完全达不到授业解惑的水平,在上记录完全是为了以一种简单永久方便的方式来保存自己的笔记。以此类推,于此相似的函数还有CLOSINGBALANCEQUARTER(),''''''YEAR(),该值表示在当前上下文中该季度/ 年最后一个日期计算的。(我做的时候,好像返回表,不知道哪里多了两个表的数据出来,元数据的子数据表)
DATAADD()返回一个表,该表包含由日期构成的一列,这些日期是在时间上从当前上下文中的日期前移或后移指定间隔数目的日
=DATEADD(DateTime[DateKey],-1,year)
没弄成
DATESBETWEEN(数据,开始,结束日期)
计算夏季销售额例子
=CALCULATE(SUM(InternetSales_USD[SalesAmount_USD]), DATESBETWEEN(DateTime[DateKey], DATE(2007,6,1), DATE(2007,8,31)
在数据透视表里面单独列显示,要是能计算每年某个时间段的销售额就好了,往下学吧,或许接下来会遇到,或许可以用嵌套呢,反正我现在不懂。
类似的year、quarter、month一样
下面的公式为 2007 年 8 月 24 日之前的 21 天返回 Internet 销售额。=
CALCULATE(SUM(InternetSales_USD[SalesAmount_USD]),DATESINPERIOD(DateTime[DateKey],DATE(2007,08,24),-21,day))
DATESMTD 函数返回一个表,该表包含当前上下文中本月截止到现在的日期列
计算本月截止到现在的总计的表达式范例=CALCULATE(SUM(InternetSales_USD[SalesAmount_USD]), DATESMTD(DateTime[DateKey]))。这个的意思就不用解释了吧,第一个已经详细的说了,这些都是类似的,CALCULATE是指上下文,他们这么说的,我也不懂具体的啥意思,但我猜可能是为了为后面的函数增加一个外在的筛选条件吧。就像这一样,增加日期筛选条件
类似DATESQTD()当前截至到本季度总计 DATESYTD()
ENDOFMONTH函数
=ENDOFMONTH(DateTime[DateKey])
不懂和CLOSINGBALANCEMONTH()有什么区别
另ENDOF季度,年
FIRSTDATE()
=FIRSTDATE('InternetSales_USD'[SaleDateKey])
和ENDOF()相对应,返回第一个日期
更有LASTDATE()
我越来越怀疑前面所说的CLOSINGBALANCEMONTH()的理解是错的,毕竟上面这两函数才是我理解的那意思,返回第一个或最后一个日期
NEXTDAY 函数
返回一个表,该表包含的一列具有当前上下文中基于 dates 列中指定的第一个日期的下一天中的所有日期,今天6/9,即返回所有6/10的数据,季度年,月,亦如此。只是自己的电脑好卡,实验的数据没出来
OPENINGBALANCEMONTH()
这才是与CLOSINGBANLANCEMONTH()相对应的,只是自己还不知道其具体的用法和意义是什么(月初库存值,不懂啊,咋计算的)
PARALLELPERIOD 函数 (并行期间,好不容易看懂英文意思,这两单词有印象)
返回一个表,该表包含由日期构成的一列,这些日期表示与当前上下文中指定的 dates 列中的日期并行的期间,该列中具有在时间中前移或后移某个数目的间隔的日期
上面我说过的DATESBETWEEN()的解决办法就是这个东东了。
实例上一年的销售额=CALCULATE(SUM(InternetSales_USD[SalesAmount_USD]), PARALLELPERIOD(DateTime[DateKey],-1,year))
PREVIOUSDAY 函数,返回当前日期的前一个日期 类似上一个月,季度,年一样
TOTALMTD(,[,])计算当前上下文中当月至今的 expression 的值
感觉和那datesMTD无异。类似Q YTD
实例=TOTALMTD(SUM(InternetSales_USD[SalesAmount_USD]),DateTime[DateKey])
今天的时间智能函数就到这把,学知识有点小累啊。而且越学越知道自己的开始的理解有问题,下一篇的时候我写一下,自己在这篇文章里面的好多错误吧,一些最基本的理论都错了,原来,知识是要去尊重权威的,不能凭自己的想当然,所有的想当然都是带着对自己知识局限条件下的无谓猜想罢了。真的好多错误,但还是感谢自己今天做相应的笔记,学习相关的知识。或许,以后会有用处的,我 等待着。