1
先说说这两天微信群里一个简单的案例,即根据下面的数据,统计每个人不含“质检”类型的非重复版本数量:
这个问题提出的时候,这位朋友给了一个得不到正确结果的写法(我猜可能是从某些文章或书上模仿写的):
结果是不是很奇怪?
不过,我更奇怪的是,他为什么会写在计算列里?通常来说,既然用Power Pivot,就不会再额外去做一个类似的姓名表,然后往里面加计算列做这样的统计,而应该直接在数据透视表里得到相应的结果。
当然,如果真是准备好了姓名表,在里面加计算列,也不难,计算列的公式可以适当改成以下这个达到目的(但这个公式其实不是很完美,因为如果继续有更多的计算列,容易出现循环引用问题):
后来,从群里的交流情况看,实际要的就是在透视表里显示就可以了,那么,这个问题就不一样了,他所写的计算列公式,其实应该是一个度量公式,即,他原来的公式本身其实没有什么错,只是写错了地方:
2
上面的问题,只是众多DAX问题的一个缩影,很多朋友总希望直接在使用(或许拿的是一些书上或文章中的案例)的过程中学习,以为通过一些例子就能很快地学会PP或DAX函数的各种用法,而没有真正静下心去先把DAX的基础知识和原理先理解一遍,其实,这是一个非常大的误区!这可能是学习DAX过程中最大的弯路!
这个误区的根源可能来源于Excel或其他一些工具的学习经验,因为在Excel中,通过一个个简单的例子,的确是能很快熟练掌握日常工作中所需要的大部分方法或技巧的。
但,DAX不是!
虽然,DAX的函数看上去跟Excel的函数基本一样,实际差异很大,不是因为函数本身的语法,而是DAX函数的使用要充分考虑其所在的计算环境(模型,表间关系、计算上下文等)。
上面的例子里,一个是在计算列里用,一个是在度量里用,环境差异就很大,结果,在计算列里需要增加其他的函数配合使用,且其背后还涉及到很多要了解的其他内容(行上下文相关问题);而在度量里,因为有数据透视表的筛选上下文的存在,你不需要再加如“姓名”相关内容的筛选条件……
在Excel里,通过一个例子学会的一个函数,换个地方,基本还是那个样子,大部分的时候,把函数的参数范围改一改就能得到正确结果,因为,这些函数引用的内容,都是相对“静态”的,而且绝大多数都是在一个表里完成计算,即使做了跨表引用,实际也没什么多表之间互相影响的情况,更没有所谓复杂的计算上下文问题。
而DAX的情况因模型的不同而存在巨大的差异,在不合适的地方写一个公式,哪怕再简单,不光是得不到正确的结果,还极有可能出现各种错误,或是你完全无法理解的结果——而这种问题,如果没有理解其原理而只看一个当前得到正确结果的公式,后面问题仍然会没完没了!步步都错!
慢慢地,你的热情就会消磨殆尽!
所以,关于DAX的学习,千万不要想着一开始就边用边学,用到再问——想这样学好DAX几乎是不可能的。一定要把基础的知识点和模型的基本原理先进行较系统性的学习,然后才是用具体的案例去练。