2011-09-01 77 views
4

看看這個TSQL代碼:是否可以在相同的select中重用聚合函數結果?

SELECT A, B, C, (MAX(A) - MAX(B))*C AS 'myCalculatedColumn', 
dbo.[udf_GetBetaInv]((MAX(A) - MAX(B))*C, A, B, C) as 'BetaInv' 
FROM dbo.MyTable 
WHERE... 

有什麼辦法有塊:(MAX(A) - MAX(B))*C寫入一次,並在myCalculatedColumn定義,也可以作爲在同一語句UDF的參數使用。

我主要關心的是性能,不確定SQL Server是否計算一次或多次,但即使只有一次,最好讓SQL代碼更具可讀性和緊湊性,並且只有一個位置可以修改,以防萬一我們應該更改公式。

編輯。我建議使用CROSS最近申請完全一樣的問題:simplify SQL statement by using CTE

回答

5

您可以在CTE

WITH CTE AS 
(
SELECT A, 
     B, 
     C, 
     (MAX(A) - MAX(B)) * C AS myCalculatedColumn 
FROM dbo.MyTable 
WHERE... 
) 
SELECT *, 
     dbo.[udf_GetBetaInv](myCalculatedColumn, A, B, C) as 'BetaInv' 
from CTE 

或者一個更簡潔的方法是define it in a CROSS APPLY定義它。 CTE在更多情況下工作。

+0

很酷的作品像一個迷人的,同樣的表現之前,但更乾淨的代碼,謝謝! –

相關問題