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

3-25 組み合わせの数を取得

SQLパズル

TableA
ID  Name        Address
--  ----------  -------
 1  サンディ     AddA
 2  ハイディ     AddB
 3  ウェンディ   AddC

TableB
ID  Data1  Data2
--  -----  -----
 1  aaa    bbb
 1  aaa    bbb
 1  aaa    ccc
 2  aaa    bbb
 2  bbb    ccc
 2  ccc    ddd

TableAのIDに紐づく
TableBのData1とData2の組み合わせの数(重複を除く)
を取得する

出力結果
ID  Name        Address  DistinctCount
--  ----------  -------  -------------
 1  サンディ     AddA                 2
 2  ハイディ     AddB                 3
 3  ウェンディ   AddC                 0


データ作成スクリプト

create table TableA(
ID      number(1),
Name    varchar2(10),
Address char(4));

insert into TableA values(1,'サンディ','AddA');
insert into TableA values(2,'ハイディ','AddB');
insert into TableA values(3,'ウェンディ','AddC');

create table TableB(
ID    number(1),
Data1 char(3),
Data2 char(3));

insert into TableB values(1,'aaa','bbb');
insert into TableB values(1,'aaa','bbb');
insert into TableB values(1,'aaa','ccc');
insert into TableB values(2,'aaa','bbb');
insert into TableB values(2,'bbb','ccc');
insert into TableB values(2,'ccc','ddd');
commit;


SQL

--■■■distinctを使う方法■■■
select a.ID,a.Name,a.Address,
(select count(*)
   from (select distinct ID,Data1,Data2 from TableB) b
  where b.ID=a.ID) as DistinctCount
from TableA a
order by ID;

--■■■集合関数をネストさせる方法■■■
select a.ID,a.Name,a.Address,
(select count(count(*))
   from TableB b
  where b.ID=a.ID
group by Data1,Data2) as DistinctCount
from TableA a
order by ID;


解説

distinctで重複を排除する方法と、
group byで重複を排除する方法があります