无团体计数

时间:2010-11-23 18:50:03

标签: sql mysql aggregate-functions

我有一个名为GUYS(ID,NAME,PHONE)的表,我需要添加一个有多少人具有相同名称的计数,同时显示所有这些,所以我不能将它们分组。 例如:

ID NAME  PHONE
1  John  335   
2  Harry 444
3  James 367
4  John  742
5  John  654

想要的输出应该是

ID NAME  PHONE COUNT
1  John  335   3
2  Harry 444   1
3  James 367   1
4  John  742   3
5  John  654   3
我怎么能这样做?我只是设法让很多人有不同的数量。

感谢

6 个答案:

答案 0 :(得分:23)

由于MySQL没有analytical functions like Oracle,您将不得不诉诸子查询。

不要使用GROUP BY,使用子选项来计算同名人员的数量:

SELECT
  t.name,
  t.phone,
  (SELECT COUNT('x') FROM Guys ct 
   WHERE ct.name = t.name) as namecounter
FROM
  Guys t

你认为为每一行运行一个子选择会很慢,但如果你有适当的索引,MySQL会优化这个查询,你会发现它运行得很好。

在此示例中,您应该在Guys.name上有一个索引。如果子查询的where子句中有多个列,则查询可能会受益于所有这些列上的单个组合索引。

答案 1 :(得分:20)

使用聚合查询:

select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from 
Guys g;

答案 2 :(得分:11)

您仍然可以使用GROUP BY作为计数,只需JOIN将其恢复到原始表格即可获得所有记录,例如:

select g.ID, g.Name, g.Phone, gc.Count
from Guys g
inner join (
    select Name, count(*) as Count
    from Guys
    group by Name
) gc on g.Name = gc.Name

答案 3 :(得分:0)

在Oracle DB中,您可以使用

SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;

答案 4 :(得分:0)

select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2

答案 5 :(得分:-1)

DECLARE @tbl table 
(ID int,NAME varchar(20), PHONE int)
insert into @tbl
select 
1  ,'John',  335   
union all
select 
2  ,'Harry', 444
union all
select 
3  ,'James', 367
union all
select 
4  ,'John',  742
union all
select 
5  ,'John',  654

SELECT
 ID
 , Name
 , Phone
 , count(*) over(partition by Name)
FROM @tbl 
ORDER BY ID