我不确定如何说出问题,我知道措辞不好,但问题本身很简单。
这就是我要做的事。
SELECT /*stuff*/
, ISNULL (a.z, a.y) AS "c1"
, SUM(a.x - c1) AS "c2"
/* more stuff */
这就是发生的事情。
列名称'c1'无效。
我甚至不确定我想做的事情是否可行。我总是可以在代码中的其他地方执行此操作,但我尝试让SQL为我完成大部分工作。
我使用的是SQL Server 2008 R2。
答案 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
仅包含值,NULL
列a.y
列a.z
NULL
为Numbers
时。我的意思是{{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"