2008-08-06 44 views
17

Si tengo datos como estos:consulta SQL, contar y agrupar por

+---+----+ 
|Key|Name| 
+---+----+ 
|1 |Dan | 
+---+----+ 
|2 |Tom | 
+---+----+ 
|3 |Jon | 
+---+----+ 
|4 |Tom | 
+---+----+ 
|5 |Sam | 
+---+----+ 
|6 |Dan | 
+---+----+ 

¿Cuál es la consulta SQL para recuperar los registros en los que Name se repite 2 o más veces?

Así, el resultado es que me gustaría

+---+ 
|Tom| 
+---+ 
|Dan| 
+---+ 

Respuesta

35

No podría ser más simple ...

Select 
Name, 
Count(Name) As Count 
From 
Table 
Group By 
Name 
Having 
Count(Name) > 1 
Order By 
Count(Name) Desc 

Esto también podría extenderse a eliminar duplicados:

Delete 
From 
Table 
Where 
Key In (
    Select 
    Max(Key) 
    From 
    Table 
    Group By 
    Name 
    Having 
Count(Name) > 1) 
+0

Para eliminar, debe dejar solo el Min (clave) y eliminar otras entradas. La consulta debe modificarse como "... donde la tecla NO IN (seleccione Min (clave) ..." – aartist

3

Este también se puede lograr uniendo la mesa consigo mismo,

SELECT DISTINCT t1.name 
FROM tbl t1 
     INNER JOIN tbl t2 
     ON  t1.name = t2.name 
WHERE t1.key   != t2.key; 
4
select name from table group by name having count(name) > 1