2011-11-15 165 views
6

我有这样的查询:使用SQL Server计算列

select 
(price1 + price2 + price3) as total_price 
from prices 

我如何使用计算列TOTAL_PRICE计算其他总这样吗?

select 
(price1 + price2 + price3) as total_price, 
(price4 + total_price) as total_price2 
from prices  

这可能吗?

+0

'这可能吗?',你有没有尝试过吗? –

+1

Ofcourse我试过了。我收到“无效的列total_price”消息。 是我试图完成的可能吗? – Khronos

+4

不在同一查询中 - 查询处理器不能使用输出列作为输入列。您需要每次都写出公式,或者进行内部查询,该查询计算一级计算列,然后从该查询中进行选择,计算下一级公式。 – Arvo

回答

11

不,不可能引用在同一级别定义的列别名。出现在相同逻辑查询处理阶段的表达式为evaluated as if at the same point in time

As Joe Celko says

事情发生“一下子”,在SQL,而不是“从左至右”,因为他们 会在一个连续的文件/程序语言模型

你可以将其定义在CTE中,然后在CTE之外重新使用它。

WITH T 
    AS (SELECT (price1 + price2 + price3) AS total_price, 
       price4 
     FROM prices) 
SELECT total_price, 
     (price4 + total_price) AS total_price2 
FROM T 
1
select T.total_price, 
     P.price4 + T.total_price as total_price2 
from prices as P 
    cross apply (select P.price1 + P.price2 + P.price3) as T(total_price) 
3

我也考虑在桌子上computed column如果将经常使用

ALTER TABLE prices ADD 
    total_price AS (price1 + price2 + price3) 

那么你的查询是

select 
    total_price, 
    (price4 + total_price) as total_price2 
from prices 

这样,你可以申请D RY原则......