0

次の値をテーブルに挿入すると

Insert into Table1 (Field1, Field2, Field3, Field4, DateField) values (1, 1, 100, 5, "5/10/2012")
Insert into Table1 (Field1, Field2, Field3, Field4, DateField) values (1, 2, 100, 99, "5/10/2012")
Insert into Table1 (Field1, Field2, Field3, Field4, DateField) values (1, 3, 100, 3, "5/10/2012")

私のクエリが試行して取得しようとしているのは、特定の日付までに Field2 の最大値を持つ Field4 の値です。

select isnull(Field4,0) from Table1 
where Field1 = 1 and Field3 = 100 and datediff(day,DateField,"5/21/2012") > 0
having Max(Field2) = Field2

これはうまくいきます。期待どおりの 3 を取得します。これが私の質問の出所です。Field3 が 110 などの他の値を持つ可能性があります。そのクエリを実行すると、

select isnull(Field4,0) from Table1 
where Field1 = 1 and Field3 = 110 and datediff(day,DateField,"5/21/2012") > 0
having Max(Field2) = Field2

結果が出ません。null である必要があり、isnull(Field4,0) は 0 を吐き出す必要があります。しかし、そうではありません。選択を count(*) に置き換えて、0 が返されるかどうかを確認しようとしましたが、何も返されません。私は途方に暮れています。これは一時テーブルに入り、別のテーブルの値と合計されるため、0 を返す必要があります。ありがとう。

編集 - 新しい質問の部分 ここで間違ったことに isnull を使用していた可能性があることを理解しています。私が受け入れることができるもの。ただし、何も返されないように case ステートメントを記述したい場合、行が返されない場合は 0 を返しません。

select count(*) from Table1 
where Field1 = 1 and Field3 = 110 and datediff(day,DateField,"5/21/2012") > 0
having Max(Field2) = Field2

上記のコードは、私が思うように 0 ではなく、何も返しません。

4

1 に答える 1

1

挿入した 3 つのレコードのいずれにも Field3 の 110 がないため、結果は得られません。その結果、クエリから行が返されません。YourISNULLは、5、99、または 3 の代わりに、それらの値がNULL返された行の値である場合にのみ使用されます。

このレコードがテーブルにあった場合:

INSERT INTO Table1 (Field1, Field2, Field3, Field4, DateField)
VALUES(1, 3, 110, NULL, "5/10/2012")

このレコードはField3 = 110要件に一致し、Field4 Null があり、SELECT ロジックによって 0 に設定されますが、そうではないため、クエリからは何も返されません。

パート2

条件に一致する句の後にレコードが残っていないため、 が結果セットからレコードをHAVING削除しているようです。0WHEREHAVING

結果が基準に一致するかどうかを確認したい場合は、EXISTS句を使用できます

IF EXISTS(
   SELECT COUNT(*)
   FROM Table1 AS t 
   WHERE t.Field1 = 1
      AND t.Field3 = 110 
      AND DATEDIFF(day, t.DateField, "5/21/2012") > 0
   HAVING MAX(Field2) = Field2
)
BEGIN
   --Code for when the record Exists
END
ELSE
BEGIN
   --No records logic here
END
于 2012-06-28T17:08:38.103 に答える