トップページに戻る    次の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関数と組み合わせることができます。