SQL对列和按ID分组的值相同的行进行计数?

时间:2019-02-21 22:26:20

标签: mysql sql group-by count

我有一个这样的表:

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

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

想要的输出:

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

5 个答案:

答案 0 :(得分:2)

在没有窗口功能的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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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)中的临时表具有不同的语法。

相关问题