使用和不使用SQL函数执行计算的区别

时间:2017-06-02 20:25:21

标签: sql-server function

我有这个问题用函数编写SQL查询而不使用SQL函数。  员工数据库有2个关系。主键是两个表的employee_name。问题是找到其员工平均薪水高于#34; FBC"

的平均薪水的company_name。

员工(employee_name,街道,城市) 作品(employee_name,COMPANY_NAME,薪水)

我的无功能查询是:

Declare@AvgSal decimal(10,2),
Declare@AvgSalFBC decimal(10,2),

Select @AvgSal=AVG(salary)
From works w, employee e
Select @AvgSalFBC=AVG(salary)
From works w, where company_name = "FBC" , employee e

ON w.employee_name=e.employee_name

If (@AvgSal>@AvgSalFBC)
Begin
Print w.company_name
End

我想知道代码是否正确以及使用SQL函数编写它的区别是什么?

2 个答案:

答案 0 :(得分:1)

我不确定SQL函数和没有函数的SQL是什么意思......但是这里有一些SQL会返回一个company_names列表:

SELECT w.company_name, avg(e.salary) as average_salary
FROM works w INNER JOIN employee e 
    ON w.employee_name = e.employee_name  
GROUP BY w.company_name  
HAVING average_salary > 
  (
    SELECT avg(e1.salary) 
    FROM works w1 INNER JOIN employee e1 
      ON w1.employee_name = e1.employee_name 
    WHERE w1.company_name = "FBC"
  );

此外,加入员工姓名似乎是一个坏主意。名称更改并且通常格式不正确。

答案 1 :(得分:0)

如果您只查看平均工资,那么您根本不需要使用employee表。只需分组 company_name,然后从avg(salary)表中获取works。像这样的一些代码可能是一个很好的起点:

select company_name, avg(salary)
from works
group by company_name

如果您想比较基于某个特定公司的其他公司,您可以先将这些结果放入临时表中。然后你可以进行任何你想要的比较。例如:

declare @CompareCompany varchar(50) = 'FBC'

create table #average(company_name varchar(50), avg_salary decimal(14,2))
insert into #average(company_name, avg_salary)
select company_name, avg(salary)
from works
group by company_name

declare @CompareSalary decimal(14,2)
select @CompareSalary = avg_salary 
from #average 
where company_name = @CompareCompany

select company_name, avg_salary
from #average
where avg_salary > @CompareSalary

当然,如果你只想要总体平均工资最高的公司,你可以随时这样做:

select top 1 company_name
from works
group by company_name
order by avg(salary) desc

我不确定你为什么询问功能。您正在谈论的数据不仅仅是一个变量可以处理的数据。将结果减少到单个函数输出(或将它们设置为单个变量,就像你正在做的那样)的唯一方法是,如果你能保证总会有一个公司符合条件(就像我上面的例子)。