带有条件的SQL查询,有时只能工作

时间:2010-12-02 19:39:40

标签: sql crystal-reports crystal-reports-xi

我正在基于数据库中的SQL存储过程创建报表(在Crystal Reports XI中)。查询接受一些参数,并返回指定日期范围内的记录。如果传入参数,它们将用于确定要返回的记录。如果未传入一个或多个参数,则该字段不用于限制返回的记录类型。这有点复杂,所以这是我的WHERE子句:

WHERE  ((Date > @start_date) AND (Date < @end_date)) 
    AND (@EmployeeID IS NULL OR emp_id = @EmployeeID) 
    AND (@ClientID IS NULL OR client_id = @ClientID)
    AND (@ProjectID IS NULL OR project_id  = @ProjectID)
    AND (@Group IS NULL OR group = @Group)

现在,针对这个问题:

查询(和报告)可以很好地处理2000 - 2005年范围内的旧数据。但是,WHERE子句最近几年没有正确地过滤数据:它只返回参数@Group为NULL的记录(即:未传入)。

任何提示,技巧或潜在客户都会受到赞赏!

3 个答案:

答案 0 :(得分:3)

解决!

毕竟,它实际上与WHERE子句无关。我让SQL Server为我生成了一个内连接,它应该是一个LEFT连接:近年来的许多记录都不包含连接表中的条目(费用),因此它们没有显示出来。有趣的是,在费用表中有条目的最近几条记录对于组有一个NULL值,这就是为什么我只在@Group为NULL时才得到记录。

故事的道德:1。仔细检查自动生成的任何内容;并且2.注意NULL值! (n8wl - 感谢给我提示仔细查看NULL。)

答案 1 :(得分:1)

你的新数据(2005年之后)在emp_id,client_id,project中有一些带有NULL的行的可能性有多大? _id还是小组?如果它们是NULL,则它们无法匹配您传递的参数。

答案 2 :(得分:0)

由于日期和组是保留字,您可以尝试在字段周围放置方括号,以便不处理它们。这样做可以摆脱像这样的“奇怪”问题。这样就可以了:

WHERE  (([Date] > @start_date) AND ([Date] < @end_date)) 
AND (@EmployeeID IS NULL OR emp_id = @EmployeeID) 
AND (@ClientID IS NULL OR client_id = @ClientID)
AND (@ProjectID IS NULL OR project_id  = @ProjectID)
AND (@Group IS NULL OR [group] = @Group)