MySQL 仅输出 n 行并将其余行分组到第 n+1 行

Posted

技术标签:

【中文标题】MySQL 仅输出 n 行并将其余行分组到第 n+1 行【英文标题】:MySQL to output only n number of rows and group the rest into n+1 th row 【发布时间】:2014-02-17 21:42:28 【问题描述】:

是否可以构建一个 SQL 查询来仅输出 n 行并将返回的其余列相加第 n+1 行。

例如,我有两列从 sql 查询返回。第一列是名称,第二列包含计数值。名称是不同的,计数是数字。

查询应该只返回 3 行,如果超过 3 行,它们都应该加起来到名为“Others”的第四行,其余行的计数加到第四行行。

请帮帮我。提前致谢。

(示例)表格 姓名 |价值 第一 - 12 第二 - 11 第三 - 9 第四 - 15 第五 - 13 第六 - 8

查询结果 姓名 |价值 第一 - 12 第二 - 11 第三 - 9 其他 - 36

【问题讨论】:

有没有关于它的尝试的现有研究? 是否有理由必须成为一个 1 查询?我可以完成,但是对于在 2 个查询中基本上非常简单的事情来说它有点笨拙。 一切都很好。两个带有临时表的查询也可以。我只是想大致了解如何实现它。谢谢 【参考方案1】:

我相信它看起来像:

SELECT DISTINCT TOP 3 Col1, Col2
FROM Table

除非你想让第二列计算一些东西,否则它会是

SELECT DISTINCT TOP 3 Col1, Count(Col2) AS "New Name"
FROM Table
GROUP BY Col1

这是假设您只想要前 3 行。如果您确实想要第 4 行,请使用另一个使用 OFFSET 的 select 语句执行 UNION,这样您就可以选择除前 3 之外的所有行。

查看here、here 和here 以获取有关 TOP、OFFSET 和 UNION 的示例。

重新阅读问题的第一部分,如果您希望更改 TOP 编号,您很可能需要将其作为存储过程,并传递一个变量来控制 TOP 和 OFFSET 的编号。使用this 作为参考。

【讨论】:

【参考方案2】:

尝试GROUP BY...WITH ROLLUP 将 n+1 行中的所有行数相加。试试下面的例子。

SELECT IFNULL(a.id, 'Other'), SUM(1) ids
FROM tableA 
GROUP BY a.id WITH ROLLUP

【讨论】:

【参考方案3】:
Could you try something like this :

select case(name) 
    when 'First' THEN 'First'
    when 'Second' THEN 'Second'
    when 'Third' THEN 'Third'
    else 'Others'
end name, sum(value) value
from table
group by case(name) 
    when 'First' THEN 'First'
    when 'Second' THEN 'Second'
    when 'Third' THEN 'Third'
    else 'Others'

【讨论】:

以上是关于MySQL 仅输出 n 行并将其余行分组到第 n+1 行的主要内容,如果未能解决你的问题,请参考以下文章

MySql第几行到第几行语句

总数统计

1470.调整方阵

JavaScript输入几个数构成的数列,输入n行,每一次输出都把最后一个数提前到第一位

在 s-s-rS 矩阵报告中获取前 20 行,其余在第 21 行

问题 B: 分组统计