2012-05-29 81 views
1

我不確定怎麼說這個問題,我知道措辭不好,但問題本身很簡單。如何在SUM語句中使用別名?

這就是我想要做的。

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

這是發生了什麼事。

無效的列名'c1'。

我甚至不確定自己想做什麼是可能的。我總是可以在代碼的其他地方執行它,但我試圖讓SQL爲我完成大部分工作。

我正在使用SQL Server 2008 R2。

+3

您不能在一個列表中使用該列並使用該列 –

+0

這就是我的想法。謝謝。 – mawburn

回答

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.zNULL。通過數值我的意思是Numbers

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 */ 
+0

現在你將如何獲得C1的總和。 –

+0

@Romil如果你在內部查詢中獲得了c1並將其別名,那麼你可以在外部查詢中使用別名 – Taryn

+0

現在,這是OP期望的答案。 +1進行修改。 –

0

容易只是結合在一行的功能。如果你不需要C1,那就把它作爲輸出消除。

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

在努力堅持「不重複自己」,我會提出一個公共表表達式:

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

這樣,您就不必重複ISNULL (a.z, a.y)位在你的查詢中。