2010-06-12 4 views
2
나는 다음과 같은 구문을 사용하여 작업을 저장 프로 시저를 얻으려고

: 기준이 쿼리가 충족되지 않는이 특별한 경우SQL은 HAVING 절

select count(sl.Item_Number) 
as NumOccurrences 
from spv3SalesDocument as sd 
left outer join spv3saleslineitem as sl on sd.Sales_Doc_Type = sl.Sales_Doc_Type and 
sd.Sales_Doc_Num = sl.Sales_Doc_Num 
where 
sd.Sales_Doc_Type='ORDER' and 
sd.Sales_Doc_Num='OREQP0000170' and 
sl.Item_Number = 'MCN-USF' 
group by 
sl.Item_Number 
having count (distinct sl.Item_Number) = 0 

는 레코드와 '수'는 반환하지 않습니다 그냥 비어 있습니다. 아무것도 반환하지 않고 조건을 적용 할 수 있도록 반환 된 0이 필요합니다.

나는 그것이 단순한 두뇌 용량을 넘어선 상당히 간단한 수정이라고 생각합니다.

도움을 주시면 대단히 감사하겠습니다.

월리

답변

0

나는이 테스트를하지만, 내 머리 위로 떨어져 그들에게 시도 포기하지 않았다

select 
    CASE count(sl.Item_Number) 
    WHEN NULL THEN 0 
    WHEN '' THEN 0 
    ELSE count(sl.Item_Number) 
    END as NumOccurrences 
: 그 중 하나가 작동하지 않는 경우

select ISNULL(count(sl.Item_Number), 0) as NumOccurrences 

는,이 시도를

1

첫 번째, sl에서 특정 where 절을 사용하면 왼쪽 외부 조인의 목적을 무효화합니다. 즉, 기본 외부 조인의 목적을 무효화합니다.

일치하는 항목이 없을 경우 0을 반환하는 것처럼 들립니다. 저는 T-SQL 프로그래머입니다. 그래서 다른 언어에서 의미가 있을지 모르겠지만 ...이 쿼리의 컨텍스트에 대해 충분히 알지 못하지만,이 쿼리를 사용하려고하는 것처럼 들립니다. 쿼리 IF 문에서 분기 중 ... 아마도 이것은 당신이 ...

IF NOT EXISTS (SELECT 1 FROM spv3SalesDocument as sd 
      INNER JOINs pv3saleslineitem as sl on sd.Sales_Doc_Type = sl.Sales_Doc_Type 
             and sd.Sales_Doc_Num = sl.Sales_Doc_Num 
      WHERE sd.Sales_Doc_Type='ORDER' 
       and sd.Sales_Doc_Num='OREQP0000170' 
       and sl.Item_Number = 'MCN-USF') 
BEGIN 
    -- Do something... 
END 
+0

나는이 하나 있지만 같은 문제를 시도, 빈 결국 또는 아무것도 내가 선택 초기에 관계없이,에 다른 답변에서 파악의 1의 하드 코딩을 고려 이상한 찾을 수있는 반환 결과 집합 항상 존재할 다른 필드를 세고 기준이 충족되는지에 따라 1 또는 0을 리턴하십시오. 당신은 내가 , 내가 지금은 다른 SQL 재료로 이동하고있어 모든 도움을 끝 감사를 시작합니다 ... 만약 위와 같은 맥락에서이를 사용하고 있다는 점에서 정확합니다. – Wally

0

group byhaving의 조합이 꽤 의심스러운 찾고 꽤 어떤 경우에도, 당신의 방법에 당신을 도울 것입니다 :

group by sl.Item_Number 
having count (distinct sl.Item_Number) = 0 

나는 Item_Number is null했다이 having 조건은 그룹을 승인 기대.

항상 행을 반환하려면 공용체를 사용하십시오. 예를 들어 :

select name, count(*) as CustomerCount 
from customers 
group by 
     name 
having count(*) > 1 
union all 
select 'No one found!', 0 
where not exists 
     (
     select * 
     from customers 
     group by 
       name 
     having count(*) > 1 
     )