如何在SUM语句中使用别名?

时间:2012-05-29 14:20:42

标签: sql sql-server sql-server-2008

我不确定如何说出问题,我知道措辞不好,但问题本身很简单。

这就是我要做的事。

 SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
      , SUM(a.x - c1) AS "c2"
 /* more stuff */

这就是发生的事情。

列名称'c1'无效。

我甚至不确定我想做的事情是否可行。我总是可以在代码中的其他地方执行此操作,但我尝试让SQL为我完成大部分工作。

我使用的是SQL Server 2008 R2。

4 个答案:

答案 0 :(得分:5)

您可以将查询放在另一个查询中以使用别名

SELECT Sum(a.x - c1) as c2
FROM
(
    SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
     /* more stuff */
) a

SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
      , SUM(a.x - ISNULL (a.z, a.y)) AS "c2"
 /* more stuff */

答案 1 :(得分:3)

您不能在SELECT的同一级别使用其他列的别名。

你必须这样做 -

SELECT /*stuff*/
  , ISNULL (a.z, a.y) AS "c1"
  , SUM(a.x - ISNULL (a.z, a.y)) AS "c2"
/* more stuff */

另外,请确保列a.z仅包含值,NULLa.ya.z NULLNumbers时。我的意思是{{1}}

答案 2 :(得分:1)

为了坚持“不要重复自己”,我将提出一个共同的表格表达式:

with cte as (
   select ISNULL (a.z, a.y) AS [c1]
   from yourTable
)
select sum([c1])
from cte

这样,您就不必在查询中重复ISNULL (a.z, a.y)位。

答案 3 :(得分:0)

更容易将功能组合在一条线上。如果您不需要C1,那么只需将其作为输出消除。

SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
      , SUM(a.x - ISNULL(a.z, a.y)) AS "c2"