【问题标题】:MySQL to output only n number of rows and group the rest into n+1 th rowMySQL 仅输出 n 行并将其余行分组到第 n+1 行
【发布时间】: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 个查询中基本上非常简单的事情来说它有点笨拙。
  • 一切都很好。两个带有临时表的查询也可以。我只是想大致了解如何实现它。谢谢

标签: mysql sql select group-by aggregate-functions


【解决方案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 之外的所有行。

查看hereherehere 以获取有关 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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        • 2018-11-13
        相关资源
        最近更新 更多