![](/img/trans.png)
[英]SQL Server Sum Aggregate function - filtering the results set?
[英]Sum the results of two function calls SQL Server
我想有效地總結兩個函數調用的結果,並在第三列中顯示該值。 這是我的語法...
SELECT TOP (1000) Region,
dbo.fn_Function1(Code, 2016) AS [Highest Students],
dbo.fn_Function2(Code, 2016) AS [Highest Schools],
dbo.fn_Function3(Code, 2016) AS [Average Students],
dbo.fn_Function4(Code, 2016) AS [Average Schools],
dbo.fn_Calculator(0,0) as [Total Students],
dbo.fn_Calculator(0,0) as [Total Schools]
From myTable
fn_calculator應該將(最高學生+平均學生)的值作為參數並求和。 (最高學歷+平均學歷)
我寧願不要在計算器函數的參數內再次重新運行函數。 我現在只有(0,0)作為占位符。 我試圖這樣加載計算器:但是它無法識別列名:
dbo.fn_Calculator([Highest Students], [Average Students])
你可以這樣做
select top (1000)
Region,
calc.[Highest Students],
calc.[Highest Schools],
calc.[Average Students],
calc.[Average Schools],
dbo.fn_Calculator(calc.[Highest Students], calc.[Average Students]) as [Total Students],
dbo.fn_Calculator(calc.[Highest Schools], calc.[Average Schools]) as [Total Schools]
From myTable as t
outer apply (select
dbo.fn_Function1(Code, 2016) AS [Highest Students],
dbo.fn_Function2(Code, 2016) AS [Highest Schools],
dbo.fn_Function3(Code, 2016) AS [Average Students],
dbo.fn_Function4(Code, 2016) AS [Average Schools]
) as calc
但是總的來說,@ TimSchmelter對於避免使用函數是非常正確的,因為標量函數通常對性能非常不利。 在您的情況下,您至少可以刪除fn_calculator
函數:
select top (1000)
Region,
calc.[Highest Students],
calc.[Highest Schools],
calc.[Average Students],
calc.[Average Schools],
calc.[Highest Students] + calc.[Average Students] as [Total Students],
calc.[Highest Schools] + calc.[Average Schools] as [Total Schools]
From myTable as t
outer apply (select
dbo.fn_Function1(Code, 2016) AS [Highest Students],
dbo.fn_Function2(Code, 2016) AS [Highest Schools],
dbo.fn_Function3(Code, 2016) AS [Average Students],
dbo.fn_Function4(Code, 2016) AS [Average Schools]
) as calc
您還可以使用cte:
;with cte as (
select top (1000)
t.Region,
dbo.fn_Function1(Code, 2016) AS [Highest Students],
dbo.fn_Function2(Code, 2016) AS [Highest Schools],
dbo.fn_Function3(Code, 2016) AS [Average Students],
dbo.fn_Function4(Code, 2016) AS [Average Schools]
From myTable as t
)
select
c.Region,
c.[Highest Students],
c.[Highest Schools],
c.[Average Students],
c.[Average Schools],
dbo.fn_Calculator(c.[Highest Students], c.[Average Students]) as [Total Students],
dbo.fn_Calculator(c.[Highest Schools], c.[Average Schools]) as [Total Schools]
from cte as c
最有效的方法是避免使用功能。 但是您可以使用子查詢或CTE:
WITH Calcs AS
(
SELECT Region,
dbo.fn_Function1(Code, 2016) AS [Highest Students],
dbo.fn_Function2(Code, 2016) AS [Highest Schools],
dbo.fn_Function3(Code, 2016) AS [Average Students],
dbo.fn_Function4(Code, 2016) AS [Average Schools],
From myTable
)
SELECT TOP 1000
[Highest Students],
[Highest Schools],
[Average Students],
[Average Schools],
dbo.fn_Calculator([Highest Students], [Average Students]) as [Total Students],
dbo.fn_Calculator([Highest Schools], [Average Schools]) as [Total Schools]
FROM Calcs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.