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