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

10-104 先頭二文字で集計

SQLパズル

KeyTable
key  Item  数量
---  ----  ----
101  A        1
102  B        2
103  C        3
201  Z        6
202  Y        5
203  X        4

Keyの先頭二文字でグループ化して、
Keyは、最小のKeyの値
Itemは、最小のKeyのItemの値で、
数量は、数量の合計
を出力する。

出力結果
key  Item  数量
---  ----  ----
101  A        6
201  Z       15

こちらを参考にさせていただきました


データ作成スクリプト

create table KeyTable(
key  number(3),
Item char(1),
数量 number(1));

insert into KeyTable values(101,'A',1);
insert into KeyTable values(102,'B',2);
insert into KeyTable values(103,'C',3);
insert into KeyTable values(201,'Z',6);
insert into KeyTable values(202,'Y',5);
insert into KeyTable values(203,'X',4);
commit;


SQL

--■■■分析関数を使う方法■■■
select distinct
min(key) over(partition by substr(key,1,2)) as key,
First_Value(Item) over(partition by substr(key,1,2) order by key) as Item,
sum(数量) over(partition by substr(key,1,2)) as 数量
from KeyTable
order by key;

--■■■分析関数を使わない方法■■■
select a.key,b.Item,a.数量
  from (select min(key) as key,sum(数量) as 数量
          from KeyTable
        group by substr(key,1,2)) a,KeyTable b
 where a.key = b.key
order by a.key;

--■■■First関数を使う方法■■■
select min(key) as key,
max(Item) Keep(Dense_Rank First order by key) as Item,
sum(数量) as 数量
  from KeyTable
group by substr(key,1,2)
order by substr(key,1,2);


解説

substr関数で、先頭二文字を取り出して
パーティションを切ったり、グループ化してます。