42 votes

Requête SQL pour obtenir une valeur qui se produit plusieurs fois

Je dois interroger ma base de données pour afficher les enregistrements dans ma table où le nom apparaît plus de trois fois. Exemple : dans ma table des étudiants, il y a 3 personnes avec le nom de famille « Smith », 4 avec « Johnson » et 1 avec « Potter ». Ma requête doit afficher les enregistrements de ceux qui portent les noms de famille Smith et Johnson, car ces valeurs se produisent plus ou moins 3 fois.

Quelqu'un peut-il m'indiquer cela? Je pensais utiliser COUNT() mais je n'arrive pas à penser comment l'appliquer ?

41voto

Martin Smith Points 174101

Pour SQL Server 2005+

 ;WITH T AS
(
SELECT *, 
       COUNT(*) OVER (PARTITION BY Lastname) as Cnt
FROM Students
)
SELECT * /*TODO: Add column list. Don't use "*"                   */
FROM T
WHERE Cnt >= 3

39voto

Depuis Oracle (mais fonctionne dans la plupart des bases de données SQL) :

 SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
HAVING COUNT(*) >= 3

PS c'est plus rapide , car vous n'avez pas de méthodes Select avec Select ici

15voto

Till Points 1806

Pour MySQL :

 SELECT lastname AS ln 
    FROM 
    (SELECT lastname, count(*) as Counter 
     FROM `students` 
     GROUP BY `lastname`) AS tbl WHERE Counter > 2

10voto

Les réponses mentionnées ici sont assez élégantes https://stackoverflow.com/a/6095776/1869562 mais lors des tests, je me rends compte qu'elle ne renvoie que le nom de famille. Et si vous vouliez retourner l'intégralité du disque lui-même ? Faites ceci (Pour Mysql)

 SELECT *
FROM `beneficiary`
WHERE `lastname`
IN (

  SELECT `lastname`
  FROM `beneficiary`
  GROUP BY `lastname`
  HAVING COUNT( `lastname` ) >1
)

6voto

garnertb Points 4775
SELECT LASTNAME, COUNT(*)
FROM STUDENTS
GROUP BY LASTNAME
ORDER BY COUNT(*) DESC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X