1

我不知道如何措辞这个问题,我知道措辞不好,但问题本身很简单。

这就是我想要做的。

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

这就是发生的事情。

列名“c1”无效。

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

我正在使用 SQL Server 2008 R2。

4

4 回答 4

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 */
于 2012-05-29T14:23:30.697 回答
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只有值或NULL列在isa.y时具有值。我的意思是价值观a.zNULLNumbers

于 2012-05-29T14:23:15.047 回答
1

为了坚持“不要重复自己”,我将提出一个公用表表达式:

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

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

于 2012-05-29T19:27:37.167 回答
0

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

SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
      , SUM(a.x - ISNULL(a.z, a.y)) AS "c2"
于 2012-05-29T14:25:51.040 回答