ejemplos datos consultas complejas sql count group-by having

datos - Consulta SQL para encontrar registros donde count> 1



sql count group by (5)

Tengo una mesa llamada PAYMENT . Dentro de esta tabla tengo una identificación de usuario, un número de cuenta, un código postal y una fecha. Me gustaría encontrar todos los registros para todos los usuarios que tienen más de un pago por día con el mismo número de cuenta.

ACTUALIZACIÓN: Además, debe haber un filtro que solo cuenta los registros cuyo código postal es diferente.

Así es como se ve la tabla:

| user_id | account_no | zip | date | | 1 | 123 | 55555 | 12-DEC-09 | | 1 | 123 | 66666 | 12-DEC-09 | | 1 | 123 | 55555 | 13-DEC-09 | | 2 | 456 | 77777 | 14-DEC-09 | | 2 | 456 | 77777 | 14-DEC-09 | | 2 | 789 | 77777 | 14-DEC-09 | | 2 | 789 | 77777 | 14-DEC-09 |

El resultado debería ser similar a esto:

| user_id | count | | 1 | 2 |

¿Cómo expresarías esto en una consulta SQL? Estaba pensando en unirme, pero por alguna razón mi cuenta está mal.


No recomendaría la palabra clave HAVING para novatos, es esencialmente para fines heredados .

No tengo claro cuál es la clave para esta tabla (¿está completamente normalizado , me pregunto?), Por lo tanto, me resulta difícil seguir su especificación:

Me gustaría encontrar todos los registros para todos los usuarios que tienen más de un pago por día con el mismo número de cuenta ... Además, debe haber un filtro que solo cuente los registros cuyo código postal sea diferente.

Así que tomé una interpretación literal.

Lo siguiente es más detallado, pero podría ser más fácil de entender y, por lo tanto, mantener (he utilizado un CTE para la tabla PAYMENT_TALLIES pero podría ser una VIEW :

WITH PAYMENT_TALLIES (user_id, zip, tally) AS ( SELECT user_id, zip, COUNT(*) AS tally FROM PAYMENT GROUP BY user_id, zip ) SELECT DISTINCT * FROM PAYMENT AS P WHERE EXISTS ( SELECT * FROM PAYMENT_TALLIES AS PT WHERE P.user_id = PT.user_id AND PT.tally > 1 );


Prueba esta consulta:

SELECT column_name FROM table_name GROUP BY column_name HAVING COUNT(column_name) = 1;


Use la cláusula HAVING y GROUP por los campos que hacen que la fila sea única

Lo siguiente encontrará

todos los usuarios que tienen más de un pago por día con el mismo número de cuenta

SELECT user_id , COUNT(*) count FROM PAYMENT GROUP BY account, user_id , date Having COUNT(*) > 1

Actualización Si solo desea incluir aquellos que tienen un ZIP distinto, primero puede obtener un conjunto distinto y luego realizarlo HAVING / GROUP BY

SELECT user_id, account_no , date, COUNT(*) FROM (SELECT DISTINCT user_id, account_no , zip, date FROM payment ) payment GROUP BY user_id, account_no , date HAVING COUNT(*) > 1


delete t1 from @tbl t1 where 1<(select count(ID) from @tbl where ID=t1.ID)


create table payment( user_id int(11), account int(11) not null, zip int(11) not null, dt date not null ); insert into payment values (1,123,55555,''2009-12-12''), (1,123,66666,''2009-12-12''), (1,123,77777,''2009-12-13''), (2,456,77777,''2009-12-14''), (2,456,77777,''2009-12-14''), (2,789,77777,''2009-12-14''), (2,789,77777,''2009-12-14''); select foo.user_id, foo.cnt from (select user_id,count(account) as cnt, dt from payment group by account, dt) foo where foo.cnt > 1;