J'ai une table nommée PAYMENT
. Dans cette table, j'ai un identifiant d'utilisateur, un numéro de compte, un code postal et une date. J'aimerais trouver tous les enregistrements de tous les utilisateurs qui effectuent plus d'un paiement par jour avec le même numéro de compte.
PDATE: En outre, il devrait exister un filtre qui ne compte que les enregistrements dont le code postal est différent.
Voici à quoi ressemble le tableau:
| user_id | compte_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 |
Le résultat devrait ressembler à ceci:
| user_id | compter | | 1 | 2 |
Comment exprimeriez-vous cela dans une requête SQL? Je pensais me joindre mais pour une raison quelconque, mon compte est faux.
Utilisez la clause HAVING et GROUP par les champs qui rendent la ligne unique
Le dessous trouvera
tous les utilisateurs qui ont plus d'un paiement par jour avec le même numéro de compte
SELECT
user_id ,
COUNT(*) count
FROM
PAYMENT
GROUP BY
account,
user_id ,
date
Having
COUNT(*) > 1
Mettre à jour Si vous souhaitez inclure uniquement ceux qui ont un zip distinct, vous pouvez d'abord obtenir un ensemble distinct, puis exécuter 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
Essayez cette requête:
SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) = 1;
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;
Je ne recommanderais pas le mot clé HAVING
pour les débutants, il est essentiellement à des fins d'héritage .
Je ne sais pas quelle est la clé de cette table (est-ce que entièrement normalisé , je me le demande?), Par conséquent, j'ai du mal à suivre votre cahier des charges:
Je souhaite rechercher tous les enregistrements de tous les utilisateurs qui effectuent plus d'un paiement par jour avec le même numéro de compte ... De plus, il devrait exister un filtre qui ne compte que les enregistrements dont le code postal est différent.
J'ai donc pris une interprétation littérale.
Ce qui suit est plus détaillé mais pourrait être plus facile à comprendre et donc à conserver (j’ai utilisé un CTE pour la table PAYMENT_TALLIES
mais il pourrait s’agir d’un 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
);