0

以下查询结果值作为单行作为值ExtendedText或零用于匹配LineNumber表数据。我需要在查询中再添加一个条件 - 如果LineNumber不存在则返回一行为零,与 null 的情况相同。查询应同时检查是否为NULL空以返回零

SELECT  ISNULL(Sum(convert(dec,DeliveryPaymentExtras.ExtendedText)),0) As ExtendedText
FROM    DeliveryPaymentExtras
WHERE   (LineNumber =21) group by LineNumber
4

2 回答 2

3

如果您只想要一个LineNumber值的结果,如代码所示,这很简单。只需删除GROUP BY LineNumber. 没有 group by 的聚合意味着结果将恰好是一行,无论我们有 0 行还是一百万行,在聚合之前:

SELECT  ISNULL(Sum(convert(dec,DeliveryPaymentExtras.ExtendedText)),0) AS ExtendedText
FROM    DeliveryPaymentExtras
WHERE   (LineNumber =21) ;

如果您想要多个值的结果(例如,如果您有:)WHERE LineNumber IN (21, 34, 55) GROUP BY LineNumber,那么这并不简单。一种方法是:

SELECT  v.LineNumber,
        ISNULL(Sum(convert(dec,d.DeliveryPaymentExtras.ExtendedText)),0) 
            AS ExtendedText
FROM    ( VALUES (21),(34),(55)
        ) AS v (LineNumber)
    LEFT JOIN DeliveryPaymentExtras AS d
        ON d.LineNumber = v.LineNumber
GROUP BY v.LineNumber ;
于 2013-11-06T06:36:30.260 回答
2

将您的值选择到变量中,然后选择该变量。

您的问题是 NULL 行数不会触发您的 ISNULL 评估 SUM 而不是查询中的行数。这是一个不同的机制。

因此,您需要将您的 ISNULL 总和选择为一个变量,然后在您的查询中从中选择:

像这样的东西:

DECLARE @Result DECIMAL(18,4)
SET @Result = 
(
SELECT  Sum(convert(dec,DeliveryPaymentExtras.ExtendedText)) As ExtendedText
FROM    DeliveryPaymentExtras
WHERE   (LineNumber =21) group by LineNumber
(


SELECT ISNULL(@Result, 0)
于 2013-11-06T06:33:09.900 回答