2010-12-02 6 views
1

データベースのSQLストアドプロシージャに基づいて(Crystal Reports XIで)レポートを作成しています。クエリはいくつかのパラメータを受け入れ、指定された日付範囲内のレコードを返します。パラメータが渡された場合は、どのレコードを返すかを決定するために使用されます。 1つ以上のパラメータが渡されない場合、そのフィールドは返されるレコードの種類を制限するために使用されません。それはので、ここで、少し複雑だだ私のWHERE句:条件付きのsqlクエリは時々動作するだけです

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のレコードのみを返します(つまり、渡されません)。

ヒント、ヒント、またはリードがありがとうございます!

+1

パフォーマンスの観点から、[catch-all queries](http://sqlinthewild.co。)のブログ記事をご覧ください。 za/index.php/2009/03/19/catch-all-queries /)。 –

+0

残りのクエリを表示できますか?ありがとう、ジョー; – JNK

+0

;それは有益です。 – dj18

答えて

3

解決済み!

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

ストーリーの道徳:1.自動的に生成されたものをダブルチェックします。 2. NULL値を調べてください! (n8wl - NULLを注意深く見ていただきありがとうございます)

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) 
+0

ちょうど試しました...うまくいきません... – dj18

1

あなたの新しいデータ(ポスト2005)はEMP_ID、CLIENT_ID、プロジェクト _id、またはグループ内のNULLのといくつかの行を持つチャンスは何ですか?それらがNULLの場合、渡しているパラメータと一致することはできません。

+0

グループにはいくつかのNULLがあります!ほとんどの行のグループはNULLに設定されています。これをどうすれば回避できますか? – dj18

+0

ところで、私はすべての私のパラメータをNULLの初期値に宣言します。違いがありますか? (私はこれで非常に新しいです!) – dj18