it-swarm.com.de

SQL-Abfrage zum Suchen von Datensätzen, bei denen count> 1 ist

Ich habe eine Tabelle mit dem Namen PAYMENT. In dieser Tabelle habe ich eine Benutzer-ID, eine Kontonummer, eine Postleitzahl und ein Datum. Ich möchte alle Datensätze für alle Benutzer finden, die mehr als eine Zahlung pro Tag mit derselben Kontonummer haben.

PDATE: Außerdem sollte es einen Filter geben, der nur die Datensätze zählt, deren Postleitzahl unterschiedlich ist.

So sieht die Tabelle aus:

| user_id | account_no | Zip | Datum | 
 | 1 | 123 | 55555 | 12-DEZ-09 | 
 | 1 | 123 | 66666 | 12-DEZ-09 | 
 | 1 | 123 | 55555 | 13-DEZ-09 | 
 | 2 | 456 | 77777 | 14-DEZ-09 | 
 | 2 | 456 | 77777 | 14-DEZ-09 | 
 | 2 | 789 | 77777 | 14-DEZ-09 | 
 | 2 | 789 | 77777 | 14-DEZ-09 | 

Das Ergebnis sollte ungefähr so ​​aussehen:

| user_id | count | 
 | 1 | 2 | 

Wie würden Sie dies in einer SQL-Abfrage ausdrücken? Ich dachte, ich mache mit, aber aus irgendeinem Grund ist meine Zählung falsch.

152

Verwenden Sie die Klausel HAVING und GROUP By für die Felder, die die Zeile eindeutig machen

Die unten finden

alle Benutzer, die mehr als eine Zahlung pro Tag mit derselben Kontonummer haben

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

Update Wenn Sie nur diejenigen einschließen möchten, die eine bestimmte Postleitzahl haben, können Sie zuerst einen bestimmten Satz abrufen und dann HAVING/GROUP BY ausführen

 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

Versuchen Sie diese Abfrage:

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

Ich würde das Schlüsselwort HAVING nicht für Neulinge empfehlen, es ist im Wesentlichen für ältere Zwecke .

Mir ist nicht klar, was der Schlüssel für diese Tabelle ist (ist es vollständig normalisiert , frage ich mich?), Daher finde ich es schwierig, Ihrer Spezifikation zu folgen:

Ich möchte alle Datensätze für alle Benutzer finden, die mehr als eine Zahlung pro Tag mit derselben Kontonummer haben ... Außerdem sollte es einen Filter geben, der nur die Datensätze zählt, deren Postleitzahl unterschiedlich ist.

Also habe ich eine wörtliche Interpretation genommen.

Das Folgende ist ausführlicher, könnte aber einfacher zu verstehen und daher zu pflegen sein (Ich habe ein CTE für die Tabelle PAYMENT_TALLIES verwendet, aber es könnte ein VIEW sein =:

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