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

5-34 インラインビューでdistinct

SQLパズル

fooテーブル
hoge  fuga  hige  moe
----  ----  ----  ---
   1     3     5    6
   1     3     4    5
   1     3     5    8
   1     5     5    5

hoge fuga higeが3つとも同じレコードについては、まとめて1レコードとみなし、
fooテーブルに何レコードあるか調べる(この場合は、1行目と3行目を同じとみなし、レコード数は3)

出力結果
件数
----
   3


データ作成スクリプト

create Table foo(
hoge number(1),
fuga number(1),
hige number(1),
moe  number(1),
primary key(hoge,fuga,hige,moe));

insert into foo values(1,3,5,6);
insert into foo values(1,3,4,5);
insert into foo values(1,3,5,8);
insert into foo values(1,5,5,5);
commit;


SQL

--■■■集合関数のネストを使用■■■
select count(count(*)) as 件数 from foo
group by hoge,fuga,hige;

--■■■インラインビューでdistinctを使用■■■
select count(*) as 件数 from
(select distinct hoge,fuga,hige from foo);

--■■■分析関数を使用■■■
select max(Rank) as 件数
from (select dense_rank() over(order by hoge,fuga,hige) as Rank from foo);


解説

distinctで重複をなくす方法や、group byで重複をなくす方法があります。