web-dev-qa-db-fra.com

compter sans groupe

J'ai une table nommée GUYS (ID, NOM, TÉLÉPHONE) et je dois ajouter le nombre de mecs portant le même nom et les montrer tous en même temps pour que je ne puisse pas les regrouper ..__

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

la sortie recherchée devrait être

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

comment pourrais-je faire ça? Je n'arrive qu'à avoir beaucoup de gars avec des comptes différents.

merci

20
east

Comme MySQL n’a pas de fonctions analytiques comme Oracle , vous devrez recourir à une sous-requête.

N'utilisez pas GROUP BY, utilisez une sous-sélection pour compter le nombre de gars ayant le même nom:

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

On pourrait penser que faire une sous-sélection pour chaque ligne serait lent, mais si vous avez les bons index, MySQL optimisera cette requête et vous verrez qu'elle fonctionne parfaitement. 

Dans cet exemple, vous devriez avoir un index sur Guys.name. Si vous avez plusieurs colonnes dans la clause where de la sous-requête, la requête bénéficierait probablement d'un seul index combiné sur toutes ces colonnes.

22
GolezTrol

Utilisez une requête globale:

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

Vous pouvez toujours utiliser un GROUP BY pour le décompte, il vous suffit de JOIN de le renvoyer à votre table d'origine pour obtenir tous les enregistrements, comme ceci:

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
10
RedFilter

Dans Oracle DB, vous pouvez utiliser

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

0
Sayantan Dey