我正在基于数据库中的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的记录(即:未传入)。
任何提示,技巧或潜在客户都会受到赞赏!
答案 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)