簡體   English   中英

對兩個函數調用SQL Server的結果求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM