Sql 从多个子查询添加多个结果

Sql 从多个子查询添加多个结果,sql,sql-server,Sql,Sql Server,我正在运行SQL Server查询,以获取交易金额、未决金额和额外金额的总和。我发现最好的解决方案是使用子查询,因此我也使用子查询,这是最快的方法。然而,尽管我可以从每个子查询中提取金额,但我不知道如何将它们相加,以便按总数排序 以下是当前的查询: SELECT *, trans + pend + extra AS totalamount FROM (SELECT (SELECT trnammt FROM Tbl_Emi

我正在运行SQL Server查询,以获取交易金额、未决金额和额外金额的总和。我发现最好的解决方案是使用子查询,因此我也使用子查询,这是最快的方法。然而,尽管我可以从每个子查询中提取金额,但我不知道如何将它们相加,以便按总数排序

以下是当前的查询:

 SELECT 
     *, trans + pend + extra AS totalamount
 FROM 
     (SELECT
          (SELECT trnammt
           FROM Tbl_Emi
           WHERE Status IN ('N', 'P')
             AND lastrecdate = (CAST(GETDATE() AS DATE))
             AND CardNo = CardNo) AS TRANS,
          (SELECT pendamt
           FROM Tbl_Emi
           WHERE Status IN ('N', 'P')
             AND lastrecdate = (CAST(GETDATE() AS DATE))
             AND CardNo = CardNo) AS PEND,
          (SELECT extraamt
           FROM Tbl_Emi
           WHERE Status IN ('N', 'P')
             AND lastrecdate = (SELECT MIN(lastrecdate) FROM Tbl_Emi)
             AND CardNo = CardNo) AS EXTRA
    FROM 
        Tbl_Emi) q

我需要将trans、pend和extra相加,得到“totalamount”。SQL Server不允许您使用简单的语法对别名进行计算,但我认为还有另一种方法可以做到这一点?

如果您只想要
trans+pend+extra
的总和,则需要更改条件部分

 SELECT CASE WHEN (lastrecdate = (CAST(GETDATE() AS DATE))
                 AND CardNo = CardNo) THEN trnammt
             ELSE 0
        END +
        CASE WHEN (pendamt = (CAST(GETDATE() AS DATE))
                 AND CardNo = CardNo) THEN trnammt
             ELSE 0
        END +
        CASE WHEN (lastrecdate = (SELECT MIN(lastrecdate) FROM Tbl_Emi)
                 AND CardNo = CardNo) THEN trnammt
             ELSE 0
        END AS totalamount
  WHERE Status IN ('N','P') 

以下是我可以很容易看到的三个问题:

  • 子查询没有聚合,因此如果它们返回多行,您将得到一个错误
  • 相关条件只引用子查询(因此它们不是真正相关的)
  • 结果可能是
    NULL
    ,因此总和将是
    NULL
此版本修复了以下三个问题:

 SELECT e.*,
        (COALESCE(trans, 0) + COALESCE(pend, 0) + COALESCE(extra, 0)) AS totalamount
   FROM (
         SELECT (
                 SELECT SUM(trnammt)
                   FROM Tbl_Emi e2
                  WHERE Status IN ('N','P')
                    AND lastrecdate = (CAST(GETDATE() AS DATE))
                    AND e2.CardNo = e.CardNo
                ) AS trans,
                (
                 SELECT sum(pendamt)
                   FROM Tbl_Emi e2
                  WHERE Status IN ('N','P')
                    AND lastrecdate = (CAST(GETDATE() AS DATE))
                    AND e2.CardNo = e.CardNo
                ) AS pend,
                (
                 SELECT sum(extraamt)
                   FROM Tbl_Emi e2
                  WHERE Status IN ('N','P')
                    AND lastrecdate = (SELECT MIN(lastrecdate) FROM Tbl_Emi)
                    AND e2.CardNo = e.CardNo
                ) AS extra
           FROM Tbl_Emi e 
        ) e

你需要分别使用trans、pend和extra吗?没关系,重要的是结果应该是它们的总和。那么,当所有数据存储在一个表中时,你为什么需要作为子查询?你可以通过简单的查询获得它们,因为你可以看到最后一个子查询具有不同的条件,因此,它不能全部假脱机在一起。您从问题中的代码示例中得到的实际错误消息是什么?