我不知道如何措辞这个问题,我知道措辞不好,但问题本身很简单。
这就是我想要做的。
SELECT /*stuff*/
, ISNULL (a.z, a.y) AS "c1"
, SUM(a.x - c1) AS "c2"
/* more stuff */
这就是发生的事情。
列名“c1”无效。
我什至不确定我想做的事情是否可行。我总是可以在代码的其他地方执行此操作,但我尝试让 SQL 为我完成大部分工作。
我正在使用 SQL Server 2008 R2。
我不知道如何措辞这个问题,我知道措辞不好,但问题本身很简单。
这就是我想要做的。
SELECT /*stuff*/
, ISNULL (a.z, a.y) AS "c1"
, SUM(a.x - c1) AS "c2"
/* more stuff */
这就是发生的事情。
列名“c1”无效。
我什至不确定我想做的事情是否可行。我总是可以在代码的其他地方执行此操作,但我尝试让 SQL 为我完成大部分工作。
我正在使用 SQL Server 2008 R2。
您可以将查询放在另一个查询中以使用别名
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 */
您不能使用同一级别中另一列的别名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
为了坚持“不要重复自己”,我将提出一个公用表表达式:
with cte as (
select ISNULL (a.z, a.y) AS [c1]
from yourTable
)
select sum([c1])
from cte
这样,您不必ISNULL (a.z, a.y)在查询中重复该位。
更容易将功能组合在一条线上。如果您不需要 C1,那么只需将其作为输出消除即可。
SELECT /*stuff*/
, ISNULL (a.z, a.y) AS "c1"
, SUM(a.x - ISNULL(a.z, a.y)) AS "c2"