2010-06-12 4 views
2

Я пытаюсь получить хранимую процедуру для работы, используя следующий синтаксис:SQL Имея пункт

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 ISNULL(count(sl.Item_Number), 0) as NumOccurrences 

Если один не работает, попробуйте это:

select 
    CASE count(sl.Item_Number) 
    WHEN NULL THEN 0 
    WHEN '' THEN 0 
    ELSE count(sl.Item_Number) 
    END as NumOccurrences 
1

Во-первых, имея конкретное предложение where sl, цель которого состоит в том, чтобы левое внешнее соединение - оно базово превращает его во внутреннее соединение.

Похоже, вы пытаетесь вернуть 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 by и having выглядит довольно подозрительно :

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

Я бы ожидать, что это условие having утверждать только группы были Item_Number is null.

Чтобы всегда возвращать строку, используйте соединение. Например:

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 
     ) 
Смежные вопросы