2015-04-27 6 views
0

Я хотел бы эффективно суммировать результаты двух вызовов функций и отображать значение в третьем столбце. Вот синтаксис у меня есть ...Суммировать результаты двух вызовов функций 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]) 
+2

Самый эффективный способ избежать функций. –

ответ

1

Наиболее эффективный способ, чтобы избежать функции. Но вы можете использовать подзапрос или 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 
+0

Спасибо за элегантное решение. К счастью, запрос нужно запускать только несколько раз в год, но через миллионы студентов. – user2055729

1

Вы можете сделать это

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 

Вы также можете использовать КТР:

;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 
+0

Спасибо за решение! Я ценю время :) – user2055729

+0

FYI - Первый пример с использованием калькулятора ДОЛЖЕН работать, однако второй пример не добавил числа, а добавил их вместе. – user2055729

+0

@ user2055729, тогда я могу предположить, что ваши функции 'fn_FunctionX' возвращают строки вместо цифр –

Смежные вопросы