【问题标题】:SQL count rows with same value in column and group by id?SQL计算列中具有相同值的行并按ID分组?
【发布时间】:2019-02-21 22:26:20
【问题描述】:

我有一张这样的桌子:

id  | value
1   |   1
2   |   1
3   |   2
4   |   3

我想知道是否可以计算具有相同值的行并按 id 对它们进行分组,但是如果我按 id 而不是按值对它们进行分组,则每次代码都会返回计数 1

想要的输出:

id  | count
1   |   2(there are 2 rows with value 1)
2   |   2
3   |   1
4   |   1

【问题讨论】:

  • 所以你不需要知道哪个值有哪个计数
  • 我不需要知道值,只需要 id 和具有相同值的行数

标签: mysql sql group-by count subquery


【解决方案1】:

你需要统计每个id列value的值:

select 
  t.id,
  (select count(*) from tablename where value = t.value) count
from tablename t 

demo
或:

select t.id, g.count
from tablename t inner join (
  select value, count(value) count
  from tablename 
  group by value
) g on g.value = t.value

demo

【讨论】:

    【解决方案2】:

    在 MySQL 8+ 中,您将使用窗口函数:

    select t.*, count(*) over (partition by value) as cnt
    from t;
    

    【讨论】:

    • 感谢您的回答,但不幸的是我使用的是 mysql 5.5
    【解决方案3】:

    在没有窗口函数的 MySQL 版本中,你可以通过 value 上的自连接来达到你想要的结果,计算第二张表中的值的数量:

    SELECT t1.id, COUNT(t2.value) AS cnt
    FROM table1 t1
    JOIN table1 t2 ON t2.value = t1.value
    GROUP BY t1.id
    

    输出:

    id  cnt
    1   2
    2   2
    3   1
    4   1
    

    Demo on dbfiddle

    【讨论】:

      【解决方案4】:

      我认为你想要的没有意义。正如我所看到的, id 列是一个自动增量整数,因此它不能按 id 分组并且有多个值分组。如果您想要的是一个表格,该表格保存一列中的数字以及该数字在另一列中出现的次数,您将必须执行以下操作:

      SELECT value AS id, COUNT(value) AS count FROM table GROUP BY value ORDER BY value ASC;
      

      【讨论】:

        【解决方案5】:

        如果你真的想要你在问题中指定的结果,我建议这样做:

        declare @Orig table (ID int, val int)
        insert into @Orig values    (1, 1),
                                    (2, 1),
                                    (3, 2),
                                    (4, 3)
        --select * from @Orig       --show example table
        declare @Stat table (val int, cnt int)
        insert into @Stat 
        select val as ID, count(val) as count from @Orig group by val order by val asc
        --select * from @Stat       --L. Ribo's query results from group/order query
        select o.ID, s.cnt from @Orig o
        inner join @Stat s on o.val = s.val
        

        结果:

        ID cnt
        1   2
        2   2
        3   1
        4   1
        

        将统计表与原始表连接起来。当然,在没有临时表的情况下,可能有一些优雅的方法可以做到这一点,但是通过逐步解决和理解对我来说更容易。这是在 SQL Server 中完成的。其他风格的 SQL(如 MySQL)中的临时表具有不同的语法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-05
          • 2015-03-06
          • 1970-01-01
          相关资源
          最近更新 更多