2017-03-05 30 views
-1

金額が> = 1024で、受信者に返信の番号が< = 3であるsqlが必要です。一定の金額より多い金額で合計を得る方法

ジョンソンアカウントが表示されているので、それは次の三つの転送に1112ドルを受け取っているため、ジョンソンが表示されて

enter image description here

:512結果は

enter image description here

例えば

、米ドル100ドル+ 500ドル、テイラーは1ドル1024ドルを払っています。ウィリアムズは4回の取引で1200を受け取って以来、そこにはありません。

私はそれが正常に動作しない

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

を試してみてください。 私はPostgreSQLを使用していますが、SQLLites構文も問題ありません。添付

そのトップ3の量に各recipientを制限するためにrow_number()と派生テーブルを使用して便利

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

をあなたのSQLは、人が、3つの以下で取引をしていなかったたことを意味3以下の量が1024以上であること –

答えて

9

ためのテーブルと行作成されsum(amount)>=1024

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 
を有するものを返す recipientによってグループ化次に、受信

返品:

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

rextesterのpostgresのデモ:すでに試されたもの:http://rextester.com/PFR74297


質問は3rd revision of the questionから、いくつかの適切な情報を取り出し、その編集されました。

私はそれが正常に動作しない

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

を試してみてください。 3つの以下の転送やsum(amount)>=1024とそれらの受信者に限定されない - その情報に基づいて

は、私はOPが3またはその受信者の転送のいずれか少ないから sum(amount)>=1024を受け recipientsを見つけたいと結論づけました。

+1

この回答は間違っています。特定の受取人が複数の送金を受け取る場合、これは3つの最大金額を合計し、OPは3以下の送金を有する名前を尋ねた。 – Patrick

+12

@パトリック私は答えが間違っていると思う理由を理解していますが、OPは質問を編集し、非常に重要な情報を削除しました。私がトップ3を取っているのは、OPが「合計(amount)> = 1024で、カウント(amount)<= 3」が彼が望む結果を提供していないからです。私はその情報を再び含むように質問をロールバックしました。 – SqlZim

+0

まず、あなたのポイントを証明するためにOP **によって行われた編集をロールバックしないでください。第二に、あなたの答えは常に存在していた問題の問題を十分に解決しておらず、OPが削除したテキストもあなたの答えを正しいものにしてくれません。いずれにしても間違っているだけです。あなたの唯一の実行可能な行動はあなたの答えを削除することであることを知って受け入れなければなりません。 [Roman Tkachuk](http://stackoverflow.com/a/42610273/3304426)は完璧な解決策を提供しました。 – Patrick

2

私が正しく理解していれば、あなたは、むしろこの必要があります:SQLiteのでファンシーな機能なし

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

作業溶液:)

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; 
関連する問題