2017-03-05 2 views
-1

Ich möchte eine SQL haben, die Empfänger gibt, die von Betrag> = 1024 erhalten, mit der Nummer der Übertragung < = 3.Wie bekomme ich die Summe mit der Zählung größer als ein bestimmter Betrag?

zB

enter image description here

Das Ergebnis ist:

enter image description here

Johnson aufgeführt ist seit Johnson Konto aufgeführt wird, weil es 1112 USD in den folgenden drei Transfers erhalten hat: 512 USD + 100 USD + 500 USD, Taylor ist mit 1 Transfer von 1024 USD. Williams ist nicht da, da er 1200 in vier Transaktionen erhält.

Ich versuche

Select recipient as account_name from transfers group by recipient 
having sum(amount)>=1024 and count(amount)<=3 

Es funktioniert nicht richtig. Ich benutze PostgreSQL, SQLLites Syntax ist auch in Ordnung.

Befestigt ist die Tabelle und die Zeilenerzeugung für Ihre bequeme

create table transfers (
     sender varchar(1000) not null, 
     recipient varchar(1000) not null, 
     date date not null, 
     amount integer not null 
); 

insert into transfers values('Smith','Taylor',convert(date,'2002-09-27'),'1024') 
insert into transfers values('Smith','Johnson',convert(date,'2005-06-26'),'512') 
insert into transfers values('Williams','Johnson',convert(date,'2010-12-17'),'100') 
insert into transfers values('Williams','Johnson',convert(date,'2004-03-22'),'10') 
insert into transfers values('Brown','Johnson',convert(date,'2013-03-20'),'500') 
insert into transfers values('Johnson','Williams',convert(date,'2007-06-02'),'400') 
insert into transfers values('Johnson','Williams',convert(date,'2005-06-26'),'400') 
insert into transfers values('Johnson','Williams',convert(date,'2005-06-26'),'200') 
+1

Ihr SQL bedeutet, dass die Person 3 oder weniger Transaktionen gehabt hat, nicht dass die Anzahl von 3 oder weniger als 1024 ist –

Antwort

9

row_number() und eine abgeleitete Tabelle unter Verwendung jeder recipient ihrer Oberseite 3 Mengen zu begrenzen empfangen, dann durch recipient Gruppieren dieser zurückkehr sum(amount)>=1024 mit

select recipient as account_name 
from (
    select * 
    , row_number() over (
     partition by recipient 
     order by amount desc 
     ) as rn 
    from transfers 
) as i 
where rn < 4 
group by recipient 
having sum(amount)>=1024 

Rücksendungen:

+--------------+ 
| account_name | 
+--------------+ 
| Johnson  | 
| Taylor  | 
+--------------+ 

rextester Postgres Demo: http://rextester.com/PFR74297


Die Frage wurde bearbeitet, dass einige relevante Informationen aus dem 3rd revision of the question entfernt: was bereits versucht wurde.

Ich versuche

Select recipient as account_name from transfers group by recipient
having sum(amount)>=1024 and count(amount)<=3

Es funktioniert nicht richtig.

Auf der Grundlage dieser Informationen, schloss ich, dass OP recipients finden wollte, die ein sum(amount)>=1024 von 3 oder weniger von irgendetwas davon Empfänger Transfer empfing - nicht mit drei oder weniger Weisungen an den Empfänger beschränkt und sum(amount)>=1024.

+1

Diese Antwort ist falsch.Wenn ein bestimmter Empfänger mehrere Überweisungen erhält, werden die 3 größten Beträge addiert, während das OP nach Namen mit 3 oder weniger Überweisungen gefragt hat. – Patrick

+12

@Patrick Ich verstehe, warum Sie denken, dass meine Antwort falsch war, aber OP bearbeitet die Frage und entfernt einige sehr wichtige Informationen. Der Grund, warum ich die ersten drei nehme, ist, weil OP sagte, dass es keine Ergebnisse liefert, die er wollte, wenn ich Summe (Betrag)> = 1024 und Anzahl (Betrag) <= 3 'habe. Ich habe die Frage rückgängig gemacht, um diese Information erneut einzubeziehen. – SqlZim

+0

Zuallererst sollten Sie ** eine von einem OP ** durchgeführte Bearbeitung niemals rückgängig machen, nur um Ihren Standpunkt zu beweisen. Zweitens, Ihre Antwort adressiert nicht ausreichend die Eröffnungs-Problemaussage, die zu jeder Zeit da war, und auch der Text, den das OP gelöscht hat, den Sie aber zurückgerollt haben, macht Ihre Antwort richtig. Es ist einfach falsch in beide Richtungen. Als etablierter Benutzer von SO sollten Sie wissen und akzeptieren, dass Ihre einzige praktikable Vorgehensweise darin besteht, Ihre Antwort zu löschen. [Roman Tkachuk] (http://stackoverflow.com/a/42610273/3304426) lieferte eine vollkommen feine Lösung. – Patrick

2

Wenn ich das richtig verstanden, du lieber diese brauchen:

SELECT recipient 
    FROM transfers 
GROUP BY 1 
HAVING count(*) < 4 
    AND sum(amount)>=1024 
0

Arbeitslösung mit SQLite und ohne Phantasie Funktionen :)

SELECT recipient AS account_name FROM 
    (
     SELECT transfers.recipient, SUM(transfers.amount) AS amountsum FROM transfers 
     WHERE transfers.rowid IN (
             SELECT tmp.rowid FROM transfers tmp 
             WHERE transfers.recipient = tmp.recipient 
             ORDER BY tmp.amount DESC 
             LIMIT 3 
           ) 
     GROUP BY transfers.recipient 
    ) 
WHERE amountsum >= 1024; 
Verwandte Themen