SQL-Abfrage zum Auffinden von Datensätzen, deren Anzahl> 1 ist



Answers

Versuchen Sie diese Abfrage:

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

Ich habe eine Tabelle namens PAYMENT . In dieser Tabelle habe ich eine Benutzerkennung, 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.

UPDATE: Zusätzlich sollte ein Filter vorhanden sein, der nur die Datensätze zählt, deren Postleitzahl unterschiedlich ist.

So sieht die Tabelle aus:

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

Das Ergebnis sollte ähnlich aussehen:

| user_id | count |
|       1 |     2 |

Wie würden Sie das in einer SQL-Abfrage ausdrücken? Ich dachte mir selbst beizutreten, aber aus irgendeinem Grund ist meine Zählung falsch.




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

Ich bin nicht klar, was der Schlüssel für diese Tabelle ist (ist es vollständig normalisiert , frage ich mich?), Folglich 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 ... Darüber hinaus sollte ein Filter vorhanden sein, 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 zu pflegen sein (Ich habe ein CTE für die Tabelle PAYMENT_TALLIES aber es könnte ein 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
              );





Links