数据库SQL实战 --12.从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略

本文详细解析了如何使用SQL对数据库中的titles表进行分组统计,重点在于如何筛选出title出现次数大于等于两次的情况,并通过DISTINCT关键字排除重复记录的影响。文章通过具体实例展示了SQL查询语句的编写技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略。

CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

解题思路

SELECT title, COUNT(DISTINCT emp_no) AS t FROM titles
GROUP BY title HAVING t >= 2
  • DISTINCT 过滤重复字段
  • WHERE后不可跟COUNT()函数,故用HAVING语句来限定t>=2的条件
要实现统计每个 `title` 类型对应的当前员工平均工资(`avg`),可以通过 SQL 查询完成此操作。以下是详细的解决方案: ### 解决方案 为了获取每个职位类型的当前员工平均工资,可以使用以下 SQL 语句: ```sql SELECT t.title, AVG(s.salary) AS avg_salary FROM titles t LEFT JOIN salaries s ON t.emp_no = s.emp_no WHERE t.to_date = '9999-01-01' AND s.to_date = '9999-01-01' GROUP BY t.title ORDER BY avg_salary ASC; ``` #### 说明 1. **连接两张** 使用 `LEFT JOIN` 将 `titles` 和 `salaries` 基于 `emp_no` 字段进行关联[^3]。 2. **筛选条件** - 条件 `t.to_date = '9999-01-01'` 和 `s.to_date = '9999-01-01'` 确保只统计当前有效的记录[^4]。 3. **聚合函数** 使用 `AVG(s.salary)` 计算每个 `title` 的平均工资。 4. **分组与排序** - 使用 `GROUP BY t.title` 对不同职位类型的数据进行分组计算。 - 使用 `ORDER BY avg_salary ASC` 按照平均工资从小到大排序[^1]。 --- ### 输出示例 假设数据如下: | title | salary | |------------------|--------| | Senior Engineer | 60000 | | Senior Engineer | 65000 | | Senior Staff | 85000 | | Senior Staff | 90000 | 执行上述 SQL 后的结果可能为: | title | avg_salary | |-----------------|------------| | Senior Engineer | 62500 | | Senior Staff | 87500 | --- ### 注意事项 - 如果某些 `title` 下没有对应的有效薪资记录,则这些 `title` 不会出现在最终结果中,除非在查询中加入额外处理逻辑来显示零值或空值[^4]。 - 数据库中的日期字段需严格匹配 `'9999-01-01'` 格式以确保正确过滤当前有效记录。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值