2010-06-12 101 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 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

首先,在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 2010-06-12 18:43:30

0

group byhaving這個組合看起來很可疑:

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 
     )