トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

9-37 順序無視でグループ化(2列)

SQLパズル

SalesSlipsテーブル
style_A  style_B  tally
-------  -------  -----
  12345    12345     12
  12345    67890      9
  67890    12345      5
  11111    77777     11
  11111    88888     22
  77777    11111     30
  77777    88888     44
  88888    88888     55
  88888    99999     66
  99999    88888     33

style_Aとstyle_Bの順序を無視した組み合わせごとの
tallyの合計を以下の形式で出力する

出力結果
style_A  style_B  tally
-------  -------  -----
  12345    12345     12
  12345    67890     14
  66666    77777     41
  66666    88888     22
  77777    88888     44
  88888    88888     55
  88888    99999     99

SQLパズル(日本語版)のパズル40 [スタイルのペア] を参考にさせていただきました
SQLパズル 第2版のパズル44 [商品のペア] を参考にさせていただきました


データ作成スクリプト

create table SalesSlips(
style_A number(5) not null,
style_B number(5) not null,
tally   number(2) not null);

insert into SalesSlips values(12345,12345,12);
insert into SalesSlips values(12345,67890, 9);
insert into SalesSlips values(67890,12345, 5);
insert into SalesSlips values(66666,77777,11);
insert into SalesSlips values(66666,88888,22);
insert into SalesSlips values(77777,66666,30);
insert into SalesSlips values(77777,88888,44);
insert into SalesSlips values(88888,88888,55);
insert into SalesSlips values(88888,99999,66);
insert into SalesSlips values(99999,88888,33);
commit;


SQL

select Least(style_A,style_B) as style_A,
greatest(style_A,style_B) as style_B,
sum(tally) as tally
  from SalesSlips
group by Least(style_A,style_B),greatest(style_A,style_B)
order by style_A,style_B;


解説

Least関数と、greatest関数で
同一行でソートしてます