2012-06-28 3 views
0

내 테이블에 다음 값을 삽입하는 경우SQL 쿼리를 사용하여 HAVING 절

어떻게 내 쿼리를 시도하고 얻을려고하는 필드 2의 최대 값 입력란 4의 값은
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") 

특정 날짜까지.

예 위대한 작품을

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을 얻는다. 이제 내 질문이 나오는 곳입니다. 내가 그 쿼리

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

내가 어떤 결과를 얻을하지 않습니다를 실행하면 입력란 3 등 (110)와 같은 다른 값을 가질 수있다. 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 대신에 아무 것도 반환하지 않습니다.

+0

를 사용할 수 있습니다. 나는이 문제를 여기서 해결하려고 나의 대답을 업데이트 할 것이다. –

답변

1

입력 한 3 개의 레코드 중 Field3에 110이 없기 때문에 결과가 나타나지 않습니다. 따라서 쿼리에서 반환 된 행이 없습니다. ISNULL은 5, 99 또는 3 대신에 사용되며 행의 값은 NULL입니다.

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

이 기록은 당신의 Field3 = 110 요구 사항을 일치합니다 다음 입력란 4 널, 당신의 선택 논리에 의해 0으로 설정되고, 그러나이되지 않기 때문에, 아무것도 것 :이 레코드는 테이블에

인 경우 귀하의 질문에 의해 반환됩니다.

제 2

HAVING 더 레코드가 HAVING 기준에 일치하도록 WHERE 절 후 남아 있지 않기 때문에 결과 세트에서 0 기록을 제거하는 것 같습니다. 어떤 결과가 당신의 기준과 일치 여부를 확인하려면

, 당신은 일반적으로 당신이 자신의 가시성을 얻을 수 있도록 별도로 요청하여 두 번째 질문에 대한 더 나은 응답을 얻을 것이다 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 
+0

맞아, 이해하지만, 결과로 null을 얻을 것으로 기대할 것이다. 이것은 isnull 함수로 처리된다. 가지고있는 조각을 벗으면 예상대로 작동합니다. 하지만 쿼리의 일부분이 필요합니다. –

+0

당신의 대답을 다시 읽은 후에 나는 아마도 당신이 옳다고 생각합니다. 위와 같이 레코드를 추가 할 수있는 옵션이 없습니다. 그러나 카운트가 0 대신 아무 것도 반환하지 않는 이유는 무엇입니까? –

+0

죄송합니다. 명확하지 않았습니다.내 대답에 레코드를 추가하라는 제안은 아니 었습니다.이 값을 가진 레코드는 WHERE 절에서 반환됩니다. 내가 0이 아닌 빈 것으로 표시되는 곳을 잘 모르겠지만 두 경우 모두 쉽게 확인하고 요청에 일치하는 레코드를 처리 할 수있는 적절한 논리를 적용해야합니다. –