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.
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
Versuchen Sie diese Abfrage:
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;
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
);