【问题标题】:SQL count records equal to 1 value and count and group the restSQL 计数记录等于 1 个值并对其余的计数和分组
【发布时间】:2014-06-25 22:17:54
【问题描述】:

我在需要编写查询时遇到问题。出于某种原因,我似乎无法得到任何工作。我知道解决方案很简单,但我似乎想不出来。

假设我的数据库中有一个名为“条目”的表,如下所示:

ID  |  Item  |  value
------------------------------
1  |  item 1  |  3
2  |  item 1  |  4
3  |  item 1  |  3
4  |  item 2  |  3
5  |  item 3  |  3
6  |  item 1  |  3
7  |  item 1  |  3
8  |  item 1  |  3
9  |  item 4  |  3
10 |  item 4  |  6

我想计算第 1 项在 value = 3 的情况下出现的次数,然后将其他项目组合在一起可以为它们提供 = 3 的计数,因此例如该表的输出将是

  Item  |  Count
---------------------
Item 1  |  5
Other   |  3

当项目 1 出现 5 次时,值为 3,所有其他值为 3 的项目被组合在一起并显示为 other,计数为 3

【问题讨论】:

    标签: mysql sql database count group-by


    【解决方案1】:

    聚合的关键是case 语句。然后,您还需要计算适当的值。在 MySQL 中,你可以这样做:

    SELECT (CASE WHEN Item = 'item 1' THEN Item ELSE 'Other' END) AS Item, COUNT(*) AS `Count3`
    FROM entrys e
    WHERE value = 3
    GROUP BY Item;
    

    MySQL 允许在GROUP BY 中使用列别名。如果你想计算所有 的值为 3 的东西,那么你可以这样做:

    SELECT (CASE WHEN Item = 'item 1' THEN Item ELSE 'Other' END) AS Item,
           COUNT(*) as AllCount, SUM(value = 3) as Count3
    FROM entrys e
    GROUP BY Item;
    

    【讨论】:

      【解决方案2】:

      尝试使用您的项目命名为Item1Other 的派生表。然后按名称对派生表进行分组并选择计数。

      SELECT
          Item,
          COUNT(*)
      FROM (
        SELECT
          (CASE
              WHEN Item = 'item 1'
              THEN 'Item 1'
              ELSE 'Other'
          END) Item
        FROM items
        WHERE value = 3) t1
      GROUP BY Item
      

      【讨论】:

      • 这就像一个魅力。只需要添加 where 子句并给出我需要的结果,感谢您的帮助,我是如此接近,但它只是让我忘记了。
      【解决方案3】:
      SELECT CASE Item WHEN 'item 1' THEN Item ELSE 'Other' END AS Item, COUNT(ID) AS `Count`
      FROM entrys
      GROUP BY CASE Item WHEN 'item 1' THEN Item ELSE 'Other' END
      

      【讨论】: