SQL有条款

时间:2010-06-12 16:11:28

标签: 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,以便我可以应用条件而不是什么。

我猜这是一个相当简单的修复,但超出了我的简单大脑容量。

非常感谢任何帮助。

沃利

3 个答案:

答案 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 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
        )