2012-05-29 4 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.z является NULL. По значениям я имею в виду 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) бит в вашем запросе.