214 votes

Requête SQL pour trouver les enregistrements où count > 1

J'ai une table nommée PAYMENT . Dans cette table, j'ai un ID utilisateur, un numéro de compte, un code postal et une date. Je voudrais trouver tous les enregistrements pour tous les utilisateurs qui ont plus d'un paiement par jour avec le même numéro de compte.

UPDATE : En outre, il devrait y avoir un filtre qui ne compte que les enregistrements dont le code postal est différent.

Voici à quoi ressemble le tableau :

| 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 |

Le résultat devrait ressembler à ceci :

| user\_id | count |
|       1 |     2 |

Comment exprimer cela dans une requête SQL ? Je pensais à une auto-jonction mais pour une raison quelconque, mon compte est faux.

410voto

Conrad Frix Points 34272

Utilisez le AYANT et GROUP By les champs qui rendent la ligne unique.

Vous trouverez ci-dessous

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

Mise à jour Si vous voulez inclure seulement ceux qui ont un ZIP distinct, vous pouvez d'abord obtenir un ensemble distinct et ensuite effectuer votre 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

59voto

user4019456 Points 481

Essayez cette requête :

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

5voto

onedaywhen Points 24594

Je ne recommanderais pas le HAVING mot-clé pour les néophytes, c'est essentiellement à des fins patrimoniales .

Je ne sais pas exactement quelle est la clé de cette table (s'agit-il de entièrement normalisé Je me pose la question), il m'est donc difficile de suivre vos spécifications :

Je voudrais trouver tous les enregistrements pour tous les utilisateurs qui ont plus d'une paiement par jour avec le même numéro de compte... De plus, il devrait être un filtre qui ne compte que les enregistrements dont le code postal est différent.

J'ai donc pris une interprétation littérale.

La méthode suivante est plus verbeuse mais pourrait être plus facile à comprendre et donc à maintenir (j'ai utilisé un fichier CTE pour la table PAYMENT_TALLIES mais ça pourrait être 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
              );

3voto

iryndin Points 108
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;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X