web-dev-qa-db-fra.com

Requête SQL pour trouver des enregistrements où nombre> 1

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.

152
Benjamin Muschko

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
303
Conrad Frix

Essayez cette requête:

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;
37
user4019456
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;
2
iryndin

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
              );
2
onedaywhen