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;