我有一个这样的表:
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
答案 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
答案 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)中的临时表具有不同的语法。