SQL查询-求和行
我试图从表上的两行计算视图中的值。 SQL Server 该表包含以下列SQL查询-求和行,sql,sql-server,Sql,Sql Server,我试图从表上的两行计算视图中的值。 SQL Server 该表包含以下列 ---------------------------------------------- |RefId | Quantity | TransferFrom | TransferTo | ---------------------------------------------- |5601 | 100 | 5580 | null | -----------------------
----------------------------------------------
|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会发生什么。查询将引发一个错误