【问题标题】:SQL Subtract two different averages in one single coulmnSQL在一列中减去两个不同的平均值
【发布时间】:2021-04-19 04:38:49
【问题描述】:

我有一个机场数据库。 我有一张名为“employees”的表和另一张名为“certified”的表。 “员工”表包括所有员工(飞行员和其他员工)的​​姓名和员工代码 命名为“开斋节”和他们的工资数量。

认证表包含指定他们可以驾驶哪些飞机的飞行员工作人员。

我想要什么:我想减去飞行员的平均工资和所有员工(飞行员和其他员工)的​​平均工资。

我使用这个代码:

Select AVG(salary) - (Select AVG(salary) from employees) as subtract
from employees as e,
     certified as c
where e.eid = c.eid

但我有一个问题:
正如您在“已认证”表中看到的,一些飞行员的“eid”重复并影响平均值。

如何在计算中只使用一次薪水?

提前谢谢你。

【问题讨论】:

  • 请指定一个 DBMS。
  • 您使用的是 MySQL 还是 MS Access?
  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接!
  • 我正在使用 sql @jarlh
  • 然后就可以去掉标签了。

标签: mysql sql


【解决方案1】:

使用条件聚合:

SELECT AVG(e.salary) - AVG(CASE WHEN c.eid IS NOT NULL THEN e.salary END) as difference
FROM employees AS e
LEFT JOIN ( SELECT DISTINCT eid
            FROM certified ) AS c ON e.eid=c.eid

第一个 AVG 计算所有行的平均工资,第二个 - 仅针对在 certified 表中匹配行的那些行(那些员工)(所有其他行的内部 CASE 都为 NULL,因此不计算在内) .

查询假定eid 列在employees 表中是唯一的(可能是主键)。

PS。也许必须交换减法中的 AVG...


在 MS Access 中,此代码可能是

SELECT AVG(e.salary) - AVG(IIF(c.eid IS NOT NULL, e.salary, NULL)) as difference
FROM employees AS e
LEFT JOIN ( SELECT DISTINCT eid
            FROM certified ) AS c ON e.eid=c.eid

【讨论】:

  • @MahdiAspanani SQL 是一种语言。所以代码不能“为” SQL,它是为 MySQL 编写的,并且是用 SQL 编写的。添加了访问特定的代码。
【解决方案2】:

您可以在 MS Access 中使用SWITCH 语句尝试如下操作

select 
AVG(salary) - AVG( switch(IsPilot =1,salary,IsPilot=0,NULL)) as substract
from 
(
select 
 distinct 
    e.eid, 
    e.salary, 
    Switch( c.eid is not null, 1 ,c.eid is NULL, 0) as IsPilot 
from 
employees e left join certified c
  on e.id=c.eid )T

MySql中对应的语句是

select 
AVG(salary) - AVG( case when IsPilot =1 then salary when IsPilot=0 then NULL end)  as substract
from 
(
select 
 distinct 
    e.eid, 
    e.salary, 
    case when c.eid is not null then  1  when c.eid is NULL then 0 as IsPilot 
from 
employees e left join certified c
  on e.id=c.eid )T

【讨论】:

  • 对于 MS Access,我更喜欢使用 IIF()... 它既短又快,而且(似乎)比 switch() 更清晰。 PS。我看不到将c.eid 两次转换为IsPilot 然后再转换为salary/null 的原因-您可以按原样将其转移到外部查询中。
  • @Akina 内部查询就像 CTE 一样,显示我们解决问题 1 的内容和方式,即区分飞行员和其他员工。问题 2 是计算平均工资之间的差异。明天 OP 可能需要其他的东西,比如说飞行员与非飞行员的平均工资之间的差异,然后 OP 将能够跟随流程并自行找到解决方案。
  • 我非常了解您的查询逻辑。这就是为什么我赞成你的回答。
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多