mysql - 将第 n 行之后的所有行组合在一起

标签 mysql sql aggregate-functions

我有当前表:

+----------+-------+
| salesman | sales |
+----------+-------+
|        1 |   142 |
|        2 |   120 |
|        3 |   176 |
|        4 |   140 |
|        5 |   113 |
|        6 |   137 |
|        7 |   152 |
+----------+-------+

我想进行查询以检索前 3 名销售员和“其他”列,这将是其他人的总和。预期的输出将是:

+----------+-------+
| salesman | sales |
+----------+-------+
| 3        |   176 |
| 7        |   152 |
| 1        |   142 |
| Others   |   510 |
+----------+-------+

我正在使用 MySQL,我对此很有经验,但我想不出一种方法来执行这种 GROUP BY

尝试使用 UNION 和 2 个 SELECT,一个用于前 3 名销售员,另一个用于“其他”,但我想不出一种方法来排除从第二个 SELECT

开始的前 3 名

最佳答案

您可以通过LEFT JOIN将您的表加入前 3 名销售员的列表,然后根据前 3 名表中的 COALESCEd 销售员编号进行分组来实现此目的(如果销售员不在前 3 名中,则为 NULL)。

SELECT COALESCE(top.sman, 'Others') AS saleman,
       SUM(sales) AS sales
FROM test
LEFT JOIN (SELECT salesman AS sman
           FROM test
           ORDER BY sales DESC
           LIMIT 3) top ON top.sman = test.salesman
GROUP BY saleman
ORDER BY saleman = 'Others', sales DESC

输出:

saleman sales
3       176
7       152
1       142
Others  510

Demo on dbfiddle

关于mysql - 将第 n 行之后的所有行组合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55708522/

相关文章:

MySQL虚拟计算列用于排名

sql - MYSQL:没有公共(public)值的两个表 SELECT

sql - 带有子查询的 Hive 更新

if-statement - 解决Tableau中IF结果的汇总和非汇总混合错误

sql - 计算 SQL 中的相似条目

mysql - 基于多个行 ID 的外键

c# - MySql 查询/C# 上的 KeyNotFoundException

MySQL插入后触发

mysql - 选择薪水高于其部门平均水平的每位员工

Django查询不同币种钱包的总余额