谢谢每一个关注DAX Share的人。谢谢每一个肯定别人努力的人。每次准备写点啥,都超级费力气。感恩有你,我才没放弃。
最近遇到的问题都有点诡异。
诡异的问题1:
card1的计算是总数,用的countdistinct,还有筛选函数ALL。按理说,Slicer 中Filter A怎么筛选都不应该对card1有影响,但是,数据就是变化了。
用其他的数据源做了一个模拟。
Table 2 = UNION(ADDCOLUMNS(FILTER('Product','Product'[Color] in {"Red","Gold"}),"View_Scope","Full"),
ADDCOLUMNS(FILTER('Product','Product'[Brand] = "Fabrikam"&& 'Product'[Color] = "Red"),"View_SCope","Red"),
ADDCOLUMNS(FILTER('Product','Product'[Color] = "Gold"),"View_Scope","Gold"))
计算了两个字段。
# brand = DISTINCTCOUNT('Table 2'[Brand])
full_dis = CALCULATE([# brand],ALL('Table 2'[View_Scope]))
这个full_dis是不根据我选的View_Scope改变的。这个符合我们对筛选函数的理解。所以,我觉得大概率是项目中的数据有特殊的地方。项目中这个数据源View逻辑复杂,慢的一塌糊涂,让我怀疑人生的速度,不想研究了。
大概总共有6万条左右数据。
SELECT count(DISTINCT VID)FROM DWOD.V_AS_F_S_J_IN_AGROUP BY VIEW_SCOPE
我用了Edit Interactions的方法解决了。让Filter A对Card1不起作用。只是有点不甘心。
刚刚又查了下~~数据对了。所以,应该是数据刷新的影响。所以筛选函数是没有问题的,稳定的好用的。
有趣的问题2:
另一个项目中的数据源连接用的是Direct Query. 之前一篇文章提到过,因为最近报M Query的问题,所以尽量都是把逻辑写在了SQL Query里面。当然也可以建立View,把逻辑写在View里面,然后Direct Query连接View。但是权限有限,为了万事少求人,我把逻辑写在了SQL Query里面。只用了数据仓库已经建立好的维度表和事实表。
准备测试阶段,直接切换数据环境就好了。挺简单的。
然后我遇到了下面这个问题。
然后对比两个环境的数据表,我发现表定义被修改了。原来很多列都是nvarchar(255)的数据类型,现在变成了text.
不过,也许数据经过检验之后,决定就应该用text呢。最重要的是,建表的同学去休假了~~那就只能调整SQL Query了。
根据错误描述信息,可以看出来主要是使用text,ntext或者image这种数据类型的限制。他们不能直接应用在where子句中,只有用NULL或者LIKE之类的函数,才能在在Where中出现。
其实我的Query里面只是SELECT,没有WHERE。不过我猜测,可能是在我POWER BI报表中,有对text类型的数据列进行计算的内容,所以就有了上面的问题。遇到这个问题挺好的,以后设计表的时候可以考虑下。
接下来还是要解决问题的。根据微软的官方文档。
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/ntext-text-and-image-transact-sql?view=sql-server-ver15
所以这样就简单了。直接把数据类型换掉就好了。
,cast([question] as varchar(max)) as'Question'
,cast([risk] as varchar(255))as'Risk'
问题解决!
搞不定的问题3:
需要对column字段列进行分组。如下图所示,Brand和Color一组,属于New 组, 然后Category属于Old组。
我们平时做的都是用Matrix矩阵表,然后构造出这个矩阵表需要的内容。其中矩阵表中的内容是度量值。DAX可以写出不同字段头,不同度量的函数用SELECTEDVALUE。但是这里好像做不到了。因为Brand, Color和Category下面显示的是他自己的列中的内容。
所以我这个表,其实是一个假表头拼出来的。
Table =
VAR n1= ADDCOLUMNS(GENERATE(VALUES('Product'[Color]),{"Color"}),"level2","New")
VAR n2= ADDCOLUMNS(GENERATE(VALUES('Product'[Brand]),{"Brand"}),"level2","New")
VAR n3 = ADDCOLUMNS(GENERATE(VALUES('Product Category'[Category]),{"Category"}),"level2","Old")
VAR result = UNION(n1,n2,n3)
return result
用这个来调整下位置的上下关系。
看上去还行,不过还是拆成两个List表比较好。
谢谢关注