トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
6-7 同上をnullに変換
SQLパズル
果物表テーブル
果物名 サイズ 価格
------ ------ ----
りんご S 68
りんご M 98
みかん S 30
みかん M 40
みかん L 50
ぶどう S 50
果物名は1回しか表示せずに(2回目以降はnullを表示)、各々のサイズと価格を出力する
果物名の降順、価格の昇順に出力する。
出力結果
果物名 サイズ 価格
------ ------ ----
りんご S 68
null M 98
みかん S 30
null M 40
null L 50
ぶどう S 50
データ作成スクリプト
create table 果物表(
果物名 char(6),
サイズ char(2),
価格 number(2),
primary key(果物名,サイズ));
insert into 果物表 values('りんご','S',68);
insert into 果物表 values('りんご','M',98);
insert into 果物表 values('みかん','S',30);
insert into 果物表 values('みかん','M',40);
insert into 果物表 values('みかん','L',50);
insert into 果物表 values('ぶどう','S',50);
commit;
SQL
--■■■case式とexistsを使用■■■
select
case when exists(select 1 from 果物表 b
where b.果物名=a.果物名
and b.価格 < a.価格)
then null else 果物名 end as 果物名,
サイズ,価格
from 果物表 a
order by a.果物名 desc,価格;
--■■■decode関数を使用■■■
select
decode((select count(果物名) from 果物表 b
where b.果物名=a.果物名
and b.価格 < a.価格
and RowNum=1),0,果物名) as 果物名,
サイズ,価格
from 果物表 a
order by a.果物名 desc,価格;
--■■■分析関数とcase式を使用■■■
select
case when Row_Number() over(partition by 果物名 order by 価格) =1 then 果物名 end as 果物名,
サイズ,価格
from 果物表 a
order by a.果物名 desc,価格;
--■■■分析関数とdecode関数を使用■■■
select
decode(Row_Number() over(partition by 果物名 order by 価格),1,果物名) as 果物名,
サイズ,価格
from 果物表 a
order by a.果物名 desc,価格;
--■■■分析関数とdecode関数を使用■■■
select
decode(min(価格) over(partition by 果物名),価格,果物名) as 果物名,
サイズ,価格
from 果物表 a
order by a.果物名 desc,価格;
--■■■分析関数とnullif関数を使用■■■
select
nullif(果物名,Lag(果物名) over(partition by 果物名 order by 価格)) as 果物名,
サイズ,価格
from 果物表 a
order by a.果物名 desc,価格;
解説
分析関数は、case式やdecode関数と組み合わせることができます。