我正在尝试使用以下语法来使用存储过程:
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 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
)