SQL查询-求和行

SQL查询-求和行,sql,sql-server,Sql,Sql Server,我试图从表上的两行计算视图中的值。 SQL Server 该表包含以下列 ---------------------------------------------- |RefId | Quantity | TransferFrom | TransferTo | ---------------------------------------------- |5601 | 100 | 5580 | null | -----------------------

我试图从表上的两行计算视图中的值。 SQL Server

该表包含以下列

----------------------------------------------
|RefId | Quantity | TransferFrom | TransferTo |
----------------------------------------------
|5601  | 100      | 5580         | null       |
-----------------------------------------------
|5850  | 200      | null         | 5601       |
-----------------------------------------------
我想添加当前行的数量,如果另一行的TransferTo col等于当前行的RefId,则添加另一行的数量

我认为:

MyAmount = [Quantity] + (SELECT [Quantity] 
                         FROM MyTable  
                         WHERE [TransferTo] = [RefId])
但是,这将返回
NULL

我最好使用变量还是使用
CAST
函数


提前感谢您的任何输入

问题是子查询可能返回
NULL
。这种情况下,
ISNUL()
优于
COALESCE()

(假设外部查询的表别名为
t

ISNULL()
更可取,因为
COALESCE()
可能会对子查询求值两次,这是不必要的开销。(否则,我更喜欢
COALESCE()
,因为它是ANSI标准函数。)


注意:如果使用的是相关子查询,则应始终限定所有列名。

问题在于子查询可能返回
NULL
。这种情况下,
ISNUL()
优于
COALESCE()

(假设外部查询的表别名为
t

ISNULL()
更可取,因为
COALESCE()
可能会对子查询求值两次,这是不必要的开销。(否则,我更喜欢
COALESCE()
,因为它是ANSI标准函数。)


注意:如果使用的是相关子查询,则应始终限定所有列名。

如果其中一个值为
NULL
,则在添加2个值时,您将获得
NULL
。因此,在两侧使用ISNULL()以避免出现
NULL

MyAmount = ISNULL([Quantity],0.00) + ISNULL((SELECT [Quantity] 
                         FROM MyTable  
                         WHERE [TransferTo] = [RefId]),0.00)

如果其中一个值为
NULL
,则在添加2个值时,您将获得
NULL
值。因此,在两侧使用ISNULL()以避免出现
NULL

MyAmount = ISNULL([Quantity],0.00) + ISNULL((SELECT [Quantity] 
                         FROM MyTable  
                         WHERE [TransferTo] = [RefId]),0.00)

你想得到这个结果吗

 ;WITH MyTable(RefId,Quantity,TransferFrom,TransferTo) AS(
      SELECT 5601,100,5580,null UNION ALL 
      SELECT 5850 ,200,null , 5601
)
SELECT x.*,MyAmount = x.[Quantity]+ISNULL( y.[Quantity] ,0)

FROM MyTable x
LEFT JOIN MyTable  AS y ON x.TransferTo=y.RefId
RefId数量从Transfer转移到MyAmount 5601100 5580空100 5850 200空5601 300
你想得到这个结果吗

 ;WITH MyTable(RefId,Quantity,TransferFrom,TransferTo) AS(
      SELECT 5601,100,5580,null UNION ALL 
      SELECT 5850 ,200,null , 5601
)
SELECT x.*,MyAmount = x.[Quantity]+ISNULL( y.[Quantity] ,0)

FROM MyTable x
LEFT JOIN MyTable  AS y ON x.TransferTo=y.RefId
RefId数量从Transfer转移到MyAmount 5601100 5580空100 5850 200空5601 300
[Quantity]或SELECT返回一个空值,因此总和产生空值。您可以使用ISNULL()检查这两个值,并将每个值设置为0。想想如果SELECT返回的值超过1会发生什么。查询将引发一个错误[Quantity],或者SELECT返回一个空值,因此总和产生空值。您可以使用ISNULL()检查这两个值,并将每个值设置为0。想想如果SELECT返回的值超过1会发生什么。查询将引发一个错误