一次查询中的 SQL 计数和平均值

Posted

技术标签:

【中文标题】一次查询中的 SQL 计数和平均值【英文标题】:SQL Counting and Average in one query 【发布时间】:2012-03-29 12:00:07 【问题描述】:

我有以下表格:

employee(ename,street,city) 其中 ename 是主键 company(cname, city) 其中 cname 是主键 works(ename,cname,salary) 其中 ename,cname 是主键,ename 引用员工,cname 引用公司。

对于works表中的每个员工姓名,我需要找到他们工作的公司总数和平均工资。

我有一些简单的 SQL 经验,但是这种高级聚合和嵌套查询对我来说还是很陌生。

我需要一个查询来执行此操作,因此输出将等于工作表中不同名称的数量,其中输出中的每一行将有多个工作和一个数字 - avg(salary),并且我也假设一个员工姓名。

如有任何帮助或建议,我将不胜感激。

这是一个家庭作业问题,它是列表中的最后一个问题,所有其他问题都在 XAMMP 环境中使用 phpmyAdmin。

谢谢!

【问题讨论】:

当你在寻求家庭作业的帮助时,你能至少告诉我们你尝试了什么吗?作业题的答案很简单,所以请您认真努力自己回答。提示:这是一个简单的聚合查询,不需要嵌套查询。 【参考方案1】:
Select
    employee.ename
    , avg(works.salary) as avgsalary
    , count(company.cname) as numjobs
from
   employee
left join
    works
      on employee.ename = works.ename
left join
    companies
      on works.cname = companies.cname
group by employee.ename

试试看。 迈克

【讨论】:

嗨,迈克,非常感谢。效果很好,并帮助我了解了 join 的工作原理以及获得多个聚合函数。我用内连接而不是左连接运行它 - 这会影响什么吗?我看不出结果有任何差异,但我确定它们在某种程度上有所不同。再次感谢 如果您在作品上没有左联接,特别是不存在关系,您将看不到该员工姓名,因为它将从内部联接中删除。如果由于某种原因您的公司表中的一行被删除(它发生了......可能没有正确设置关键约束),那么即使存在工作关系,计数也可能会关闭。这就是我选择左加入的两个原因。 嗯。 aweomse,非常感谢。让我的学习压力减轻了! 我看到这里需要按 分组,否则我们只会得到一个合并行。我看到左连接自下而上工作,并且可以将多个表分块在一起,就好像它们是一个表一样,但是您仍然可以通过使用它们独特的父表名称来引用这些属性。我想在这里我们可以一起绕过员工表,只需将工作和公司连接在一起,并执行相同的查询,但如果我们想要员工的街道和城市,这种方式肯定会奏效。此查询的大部分功能是否来自 group by 子句?它是不是单独的物品?

以上是关于一次查询中的 SQL 计数和平均值的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以获取时间范围列表的平均值

SQL 限制平均值

Oracle SQL如何找到小于平均值的计数

如何编写 BigQuery/SQL 查询以将一个表中的列的平均值与第二个/另一个表中的列相除

可以在查询中保留分数吗?

SQL:计数超过平均 HAVING 与 WHERE