我正在尝试从表中的2行计算视图中的值。 SQL Server。
该表包含这些列
A
如果另一行的TransferTo col等于当前行的RefId,我想添加当前行的数量和另一行的数量。
在视图中我有:
----------------------------------------------
|RefId | Quantity | TransferFrom | TransferTo |
----------------------------------------------
|5601 | 100 | 5580 | null |
-----------------------------------------------
|5850 | 200 | null | 5601 |
-----------------------------------------------
但是,这将返回MyAmount = [Quantity] + (SELECT [Quantity]
FROM MyTable
WHERE [TransferTo] = [RefId])
。
我最好使用变量还是NULL
函数?
提前感谢任何输入
答案 0 :(得分:2)
问题是子查询可能正在返回NULL
。这种情况ISNUL()
优于COALESCE()
:
MyAmount = ([Quantity] +
ISNULL((SELECT t2.[Quantity] FROM MyTable t2 WHERE t2.[TransferTo] = t.[RefId]), 0)
)
(这假设外部查询的表别名是t
。)
ISNULL()
更可取,因为COALESCE()
可能会对子查询进行两次评估,这是不必要的开销。 (否则,我更喜欢COALESCE()
,因为它是ANSI标准函数。)
注意:如果您使用的是相关子查询,则应始终限定所有列名称。
答案 1 :(得分:0)
如果值为NULL
,则在添加2个值时,您将获得NULL
的值。因此,请在两侧使用ISNULL()以避免使用NULL
。
MyAmount = ISNULL([Quantity],0.00) + ISNULL((SELECT [Quantity]
FROM MyTable
WHERE [TransferTo] = [RefId]),0.00)
答案 2 :(得分:0)
你想得到这个结果吗?
<html>
<head>
<link rel="stylesheet" type="text/css" href="style_q1.css">
<script type="text/javascript">
var timer="60";
var min="0";
var sec="0";
function startTimer() {
min=parseInt(timer/60);
sec=parseInt(timer%60);
if(timer<1){
window.location="index.html";
}
document.getElementById("time").innerHTML = "<b> Time Left: </b>"+min.toString()+":"+sec.toString();
timer--;
setTimeout(function(){
startTimer();
}, 1000) ;
}
</script>
</head>
<body onload="startTimer();">
<div id="top">
</div>
<div id="logo">
<h1 style="color:white;"> Question 1 - Geography </h1>
</div>
<div id="game_area">
<center> <h2> What is the capital of Ireland? </h2> </center>
</div>
<body onload="startTimer();">
<div id="time">
<center> <b>[<span id="time" ></span></b>]</center>
</div>
</body>
</html>
RefId Quantity TransferFrom TransferTo MyAmount 5601 100 5580 NULL 100 5850 200 NULL 5601 300