熟悉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
的结果,但报告总是一团糟。
所以我的问题是:我在这里做错了什么?
答案 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_expensegroups
和invoicerows
之间没有连接条件,因此您的查询无法正常工作。例如,给定一个列表人们,这些人最喜欢的食物清单,以及他们喜欢的颜色列表如下:
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
这本质上是食物和颜色之间的交叉连接,也称为笛卡尔积,因为它们与每个人有多对一的关系,但彼此没有关系。
报告中有几种方法可以解决这个问题。
project_id
和project_phase_id
参数的组合从主报告中调用。一些注意事项:
答案 2 :(得分:0)
我找到了解决方案,毕竟它很容易。我将第二个LEFT OUTER JOIN
更改为INNER JOIN
,并将查询得到的结果保留为零。我还使用了SELECT DISTINCT
现在我的报告工作正常。