DAX分享16:Mark下最近遇到的三个问题

浏览: 1314

谢谢每一个关注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表比较好。

谢谢关注


推荐 0
本文由 懒胖子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册