-1

tbl_トランザクション:

Sender       Receiver   Amount  Date
1102504637  31750690083 50      03/04/2013
1102504637  31750690083 50      04/04/2013
1102504637  31750690083 50      06/04/2013
1102504637  31750690083 50      07/04/2013
1102504637  31750690083 50      09/04/2013
1102504637  31750690083 50      10/04/2013
1102512397  31811645749 200     24/04/2013
1102512397  31811645749 200     01/04/2013
1102185152  31823355218 100     14/04/2013
1102185152  31823355218 100     22/04/2013
1102185152  31823355218 100     23/04/2013

同じ受信者に最大 200 を送信する送信者に基づいて結果を取得したいと思います (最も早い日付に基づいて、最大 200 を送信した最初の送信者が結果リストに表示されます)。

50x4、100x2、200x1 のトランザクションを行っている人の数を知りたかったのです。そのため、合計金額を 200 まで送信した送信者のみが結果リストに表示されます。SQL Server 2005 を使用しています。

サンプル結果:

Sender          Receiver    Amount  count
1102504637  31750690083     50      4
1102512397  31811645749     200     1
1102185152  31823355218     100     2
4

2 に答える 2

1

これには累計が必要です。アイデアは単純です。累積合計が 200 以下の行を選択するだけです。

SQL Server 2005 には組み込みの累積合計がありません (SQL Server 2012 にはあります)。この状況では、相関サブクエリを使用する傾向があります。

select sender, receiver, amount, count(*)
from (select t.*,
             (select sum(t2.amount)
              from t t2
              where t2.sender = t.sender and
                    t2.receiver = t2.receiver and
                    t2.date <= t.date
             ) as cumAmount
      from t
     ) t
where cumAmount <= 200
group by sender, receiver, amount

注:あなたの例では、特定のペアの金額はすべて同じです。それらが異なる場合、このクエリは各ペアのすべての金額を異なる行にリストします。

于 2013-06-18T10:37:54.413 に答える
1

SQL Server 2005 を使用しているため、CROSS APPLYクエリを使用して実行中の合計を取得できます。

select t.sender, t.receiver,
  t.amount, c.Total
from tbl_transaction t
cross apply
(
  select count(*) total
  from tbl_transaction t1
  where t.sender = t1.sender
    and t.receiver = t1.receiver
    and t.date <= t1.date
  having sum(amount) = 200
) c;

デモで SQL Fiddle を参照してください

于 2013-06-18T10:41:03.177 に答える