1

クレジット カード トランザクションの MySQL データ セットがあります。

create table trans (
  card_id int,
  amount int
);

insert into trans values (1, 1);
insert into trans values (2, 1);
insert into trans values (3, 1);
insert into trans values (4, 1);
insert into trans values (5, 1);
insert into trans values (5, 1);
insert into trans values (6, 1);
insert into trans values (6, 1);
insert into trans values (7, 1);
insert into trans values (7, 1);
insert into trans values (8, 1);
insert into trans values (8, 1);
insert into trans values (8, 1);
insert into trans values (9, 1);
insert into trans values (9, 1);
insert into trans values (9, 1);
insert into trans values (10, 1);
insert into trans values (10, 1);
insert into trans values (10, 1);
insert into trans values (10, 1);

私は知りたいです:

1. how many cards were used to make at least 1 transaction
2. how many cards were used to make at least 5 transactions
3. how many cards were used to make at least 10 transactions
4. how many cards were used to make at least 20 transactions
etc...

グループが重複しているため、条件付き集計の方が優れたアプローチのようです。

select sum(cnt >= 1) as trans_1,
       sum(cnt >= 5) as trans_5,
       sum(cnt >= 10) as trans_10,
       sum(cnt >= 20) as trans_20
from (select card_id, count(*) as cnt
      from trans
      group by card_id 
      ) d;

問題は、上記が列で結果セットを生成することですが、行で結果セットを生成しようとしています。

MySQL で列を行にピボットする従来の方法は、select sum() from table union のシーケンスを繰り返し使用することですが、この場合、ベース データは派生テーブルであるため、この方法はここでは機能しないようです。列を行に反転する方法のアイデアはありますか?

http://sqlfiddle.com/#!9/0f741/3

4

2 に答える 2

2

これを行うには、計算後に行をピボットするか、別の行で計算を実行します。最初のほうがパフォーマンスがはるかに優れているはずです。

select x.which,
       (case when x.n = 1 then trans_1
             when x.n = 2 then trans_5
             when x.n = 3 then trans_10
             when x.n = 4 then trans_20
        end) as numtransactions
from (select sum(cnt >= 1) as trans_1,
             sum(cnt >= 5) as trans_5,
             sum(cnt >= 10) as trans_10,
             sum(cnt >= 20) as trans_20
      from (select card_id, count(*) as cnt
            from trans
            group by card_id 
           ) d
     ) d join
     (select 1 as n, '1 or more' as which union all
      select 2, '5 or more' union all
      select 3, '10 or more' union all
      select 4, '20 or more'
     ) x
order by x.n;
于 2015-04-16T19:55:44.963 に答える