2017-06-02 80 views
-1

我有这个问题,使用函数编写SQL查询而不使用SQL函数。 雇员数据库有2个关系。主键是两个表的employee_name。问题是要找到员工平均薪水高于“FBC”的平均工资的company_name使用和不使用SQL函数执行计算的区别

员工(employee_name,street,city) works( employee_name,COMPANY_NAME,薪水)

我的查询,而功能:

[email protected] decimal(10,2), 
[email protected] 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

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

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 

我不知道你为什么问关于功能。你所谈论的数据不仅仅是一个变量可以处理的数据。您可以将结果减少到单个函数输出(或将它们设置为像您一样的单个变量)的唯一方法是,如果您可以保证总是只有一家公司符合条件(就像我上面的最后一个示例一样)。

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" 
); 

另外,加入对员工的名字好像一个坏主意。名称改变,通常格式不正确。