SSRS查询和WHERE有多个

时间:2014-09-16 12:08:51

标签: sql tsql reporting-services

熟悉SQL和SSRS并且可以做很多事情,但我认为我必须缺少一些基础知识,因此我总是把头埋在墙上。

根据条件,报告几乎正常,需要有更多结果

到目前为止我的工作查询是这样的:

SELECT projects.project_number, project_phases.project_phase_id, project_phases.project_phase_number, project_phases.project_phase_header, project_phase_expensegroups.projectphase_expense_total, invoicerows.invoicerow_total
FROM   projects INNER JOIN 
                project_phases ON projects.project_id = project_phases.project_id
                LEFT OUTER JOIN
                project_phase_expensegroups ON project_phases.project_phase_id = project_phase_expensegroups.project_phase_id
                LEFT OUTER JOIN 
                invoicerows ON project_phases.project_phase_id = invoicerows.project_phase_id
WHERE  ( projects.project_number = @iProjectNumber )
       AND
       ( project_phase_expensegroups.projectphase_expense_total >0 )

该参数用于selectionlist,用于为报告选择项目。

如何拥有的记录 值( project_phase_expensegroups.projectphase_expense_total )的{​​{1}}但该项目阶段可能有发票?

已经尝试添加另一个这样的条件:

0

但是虽然它提供了一些结果 - 也是WHERE ( projects.project_number = @iProjectNumber ) AND ( project_phase_expensegroups.projectphase_expense_total > 0 ) OR ( invoicerows.invoicerow_total > 0 ) 值为projectphase_expense_total的结果,但报告总是一团糟。

所以我的问题是:我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

在where子句中需要额外的括号才能使逻辑正确。

WHERE ( projects.project_number = @iProjectNumber )
      AND (
           (project_phase_expensegroups.projectphase_expense_total > 0)
           OR
           (invoicerows.invoicerow_total > 0)
      )

此外,您正在使用WHERE子句中的列来保留连接的表,而不检查NULL。这基本上使它成为(慢)内连接。如果要包含与该表不匹配的行,还需要检查NULL。除IS NULL之外的任何其他比较对NULL值始终为false。有关SQL的三个值谓词逻辑的更多信息,请参阅此页面:http://www.firstsql.com/idefend3.htm

为了让LEFT JOIN按预期工作,您需要执行此操作:

WHERE ( projects.project_number = @iProjectNumber )
      AND (
           project_phase_expensegroups.projectphase_expense_total > 0
           OR project_phase_expensegroups.project_phase_id IS NULL
           OR invoicerows.invoicerow_total > 0
           OR invoicerows.project_phase_id IS NULL
      )

答案 1 :(得分:0)

您的查询存在一个核心问题,即您要加入两个表,这意味着行可能不存在,但随后在这些表上放置条件,这将消除NULL。这意味着您的查询内部不一致。

下一个问题是您要将两个表连接到project_phases,这两个表可能有多行。由于这些数据彼此不相关(事实证明,project_phase_expensegroupsinvoicerows之间没有连接条件,因此您的查询无法正常工作。例如,给定一个列表人们,这些人最喜欢的食物清单,以及他们喜欢的颜色列表如下:

People

Person
------
Joe
Mary

FavoriteFoods

Person Food
------ ---------
Joe    Broccoli
Joe    Bananas
Mary   Chocolate
Mary   Cake

FavoriteColors

Person Color
------ ----------
Joe    Red
Joe    Blue
Mary   Periwinkle
Mary   Fuchsia

当您使用Person< - >之间的链接加入这些链接时食物和人物< - >颜色,你会得到这样的结果:

Person Food      Color
------ --------- ----------
Joe    Broccoli  Red
Joe    Bananas   Red
Joe    Broccoli  Blue
Joe    Bananas   Blue
Mary   Chocolate Periwinkle
Mary   Chocolate Fuchsia
Mary   Cake      Periwinkle
Mary   Cake      Fuchsia

这本质上是食物和颜色之间的交叉连接,也称为笛卡尔积,因为它们与每个人有多对一的关系,但彼此没有关系。

报告中有几种方法可以解决这个问题。

  1. 创建ExpenseGroup和InvoiceRow子报告,这些子报告通过project_idproject_phase_id参数的组合从主报告中调用。
  2. 将一个或另一组数据汇总为单个值。例如,您可以汇总发票行。或者,您可以将费用组连接成一个用逗号分隔的单个字符串。
  3. 一些注意事项:

    • 请先将您的查询格式化,然后再将其发布到问题中。没有格式化时几乎不可能读取。很明显,您使用GUI来创建查询,但帮助我们不必自己格式化它只是为了帮助您
    • 格式化时,请使用别名,不要使用完整的表名。它只是让查询更难理解。

答案 2 :(得分:0)

我找到了解决方案,毕竟它很容易。我将第二个LEFT OUTER JOIN更改为INNER JOIN,并将查询得到的结果保留为零。我还使用了SELECT DISTINCT

现在我的报告工作正常。