1

データベース内のSQLストアドプロシージャに基づいて(Crystal Reports XIで)レポートを作成しています。クエリはいくつかのパラメータを受け入れ、指定された日付範囲内のレコードを返します。パラメータが渡された場合、それらは返されるレコードを決定するために使用されます。1つ以上のパラメーターが渡されない場合、そのフィールドは、返されるレコードのタイプを制限するために使用されません。少し複雑なので、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である(つまり、渡されない)レコードのみを返します。

ヒント、ヒント、またはリードは大歓迎です!

4

3 に答える 3

3

解決しました!

結局のところ、それは実際にはWHERE句とは何の関係もありませんでした。SQL Serverに内部結合を生成させましたが、これは左結合である必要がありました。近年の多くのレコードには、結合テーブル(経費)のエントリが含まれていないため、表示されませんでした。興味深いことに、経費テーブルにエントリがある最近のいくつかのレコードでは、グループの値がNULLになっています。そのため、@GroupがNULLの場合にのみレコードを取得しました。

ストーリーの道徳:1。自動的に生成されるものをすべて再確認します。および2.NULL値に注意してください!(n8wl-NULLを詳しく調べるためのヒントをくれてありがとう。)

于 2010-12-12T00:34:32.290 に答える
1

新しいデータ(2005年以降)のemp_id、client_id、project _id、またはgroupにNULLの行が含まれている可能性はどのくらいありますか?それらがNULLの場合、渡したパラメーターと一致することはできません。

于 2010-12-02T20:18:03.073 に答える
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)
于 2010-12-02T19:47:03.797 に答える