SQL查询 - 总和行

时间:2018-01-16 12:31:52

标签: sql sql-server

我正在尝试从表中的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函数?

提前感谢任何输入

3 个答案:

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