为什么子查询字段不过滤tablix,但是主查询字段呢?

时间:2019-03-26 14:47:10

标签: sql filter subquery ssrs-tablix

我不太擅长SQL或SSRS,因此请原谅任何不正确的术语。我在一家木材店工作,正在编辑零件报表,该报表具有一个现有查询,该查询返回包含重复数据的单独字段。字段之一是从某些联接中直接选择,另一个字段是别名的子查询。我只想使用子查询字段来保持一致。

我尝试将tablix过滤器设置为[MAT_DESC] <>(保留空白),但是tablix不过滤。 [MATNAME] <>(保留空白)有效。 not(isnothing([MAT_DESC]))= True也可以。

WITH ORDERLIST AS (SELECT ... FROM ... WHERE...)
SELECT
IDBGPL.MATNAME, --THIS ONE WILL FILTER
(SELECT MAT.TEXT FROM MAT WHERE MAT.NAME=IDBGPL.MATID) AS MAT_DESC, --THIS ONE WON'T FILTER
(SELECT MAT.ORDERID FROM MAT WHERE MAT.NAME=IDBGPL.MATID) AS MAT_DESC2, --THIS ONE IS ALSO USED AND COMES FROM THE SAME TABLE
FROM ORDERLIST
INNER JOIN...
INNER JOIN...
INNER JOIN...

当我尝试用子查询字段过滤表时,它不起作用。当我使用直接选择的字段时。为什么SSRS对子查询字段的处理方式不同?

编辑:进行一些澄清。数据来自CAD / CAM程序。 IDBGPL表具有系统中每个顺序的每个部分。 MAT表是程序的一部分,描述每种材料。在某些父/子部件中,父部件没有材料。我想过滤掉那些父部件。

1 个答案:

答案 0 :(得分:0)

这可能返回NULL:

(SELECT MAT.TEXT FROM MAT WHERE MAT.NAME=IDBGPL.MATID) AS MAT_DESC

除了检查它是否为NULL之外,您不能评估NULL值。

所以一种解决方案是永远不要让它为空:

ISNULL((SELECT MAT.TEXT FROM MAT WHERE MAT.NAME=IDBGPL.MATID),"") AS MAT_DESC

另一种解决方案是在外部(在SSRS中)检查它是否为NULL,因此检查NULL还是空白。您只需要了解它们的值不相同即可。

此外,您应该考虑进行LEFT JOIN交配,而不是使用子查询。