文章目录
问题描述
Oracle
MySQL
Microsoft SQL Server
PostgreSQL
SQLite
总结
大家好,我是只谈技术不剪发的 Tony 老师。
今天给大家介绍一个 SQL 实战案例:通过横向子查询(LATERAL subquery)实现销量冠军分析。文章描述了 Oracle、MySQL、Microsoft SQL Server、PostgreSQL 以及 SQLite 中的实现方法。
如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁
📝本文使用的示例表可以点此下载。
问题描述
公司的销售人员负责各种产品的销售,emp_sales 表中记录了每个销售人员每个月份的销量数据。以下是该表中的一些示例数据:
SELECT * FROM emp_sales;
emp_id|sale_year|sale_month|amount |
------|---------|----------|--------|
19| 2021| 1|15672.53|
20| 2021| 1|11160.46|
21| 2021| 1|13763.75|
22| 2021| 1|11210.34|
23| 2021| 1|14610.88|
24| 2021| 1|13747.64|
25| 2021| 1|12816.20|
19| 2021| 2|14413.77|
20| 2021| 2|14266.04|
21| 2021| 2|16984.42|
...
emp_sales 表中的字段分别表示员工编号、销售年份、销售月份以及销售金额。
现在我们想要知道每个月份的销售冠军,也就是每个月份销售金额最高的员工。请问应该如何使用 SQL 查询实现?
从原理上来说,我们可以分别通过查询找出每个月份销量最高的员工。例如 2021 年 1 月份的销量冠军可以使用一下查询语句:
-- MySQL、PostgreSQL 以及 SQLite
SELECT s.sale_year, s.sale_month, e.emp_name, s.amount
FROM emp_sales s
JOIN employee e ON (e.emp_id = s.emp_id)
WHERE s.sale_year = 2021
AND s.sale_month = 1
ORDER BY s.amount DESC
LIMIT 1;
-- Oracle 和 SQL Server
SELECT s.sale_year, s.sale_month, e.emp_name, s.amount
FROM emp_sales s
JOIN employee e ON (e.emp_id = s.emp_id)
WHERE s.sale_year = 2021
AND s.sale_month = 1
ORDER BY s.amount DESC
offset 0 ROWS
FETCH FIRST 1 ROWS ONLY;
sale_year|sale_month|emp_name|amount |
---------|----------|--------|--------|
2021| 1|庞统 |15672.53|
然后使用同样的方法获取其他月份分销量冠军。
SQL 案例分析之月度销量冠军
最新推荐文章于 2022-09-30 10:44:30 发布