2月5日(金)2コマ目
今日、やったこと
シーケンス確認演習
シーケンスの確認演習の解答例
テーブル作成
ジャンルマスタ
create table ジャンルマスタ(
ID number(2),
ジャンル名 nvarchar2(64) not null,
constraint pk_ジャンル primary key(ID)
);
商品マスタ
create table 商品マスタ(
ID number(3),
商品名 nvarchar2(64) not null,
ジャンルID number(2),
定価 number(5),
constraint pk_商品 primary key(ID),
constraint fk_商品_ジャンル foreign key(ジャンルID) references ジャンルマスタ(ID),
constraint chk_商品定価 check(定価>=0)
);
顧客マスタ
create table 顧客マスタ(
ID number(4),
氏名 nvarchar2(64) not null,
constraint pk_顧客 primary key(ID)
);
売上データ
create table 売上データ(
ID number(5),
顧客ID number(4),
売上日 date,
constraint pk_売上データ primary key(ID),
constraint fk_売上_顧客 foreign key(顧客ID) references 顧客マスタ(ID)
);
売上詳細データ
create table 売上詳細データ(
売上ID number(5),
商品ID number(3),
数量 number(4),
constraint pk_売上詳細データ primary key(売上ID, 商品ID),
constraint fk_売上詳細_ID foreign key(売上ID) references 売上データ(ID),
constraint fk_売上詳細_商品 foreign key(商品ID) references 商品マスタ(ID),
constraint chk_売上数量 check(数量 >= 0)
);
シーケンス作成
SEQ_グループID
create sequence SEQ_グループID
start with 1
increment by 1
minvalue 1
maxvalue 99
nocycle;
または
create sequence SEQ_グループID
maxvalue 99;
SEQ_商品ID
create sequence SEQ_商品ID
start with 1
increment by 1
minvalue 1
maxvalue 999
nocycle;
または
create sequence SEQ_商品ID
maxvalue 999;
SEQ_顧客ID
create sequence SEQ_顧客ID
start with 1
increment by 1
minvalue 1
maxvalue 9999
nocycle;
または
create sequence SEQ_顧客ID
maxvalue 9999;
SEQ_売上ID
create sequence SEQ_売上ID
start with 1
increment by 1
minvalue 1
maxvalue 9999
nocycle;
または
create sequence SEQ_売上ID
maxvalue 9999;
データ登録
ジャンルマスタ、商品マスタ
--- ジャンル名:フィナンシェ
insert into ジャンルマスタ(ID, ジャンル名) values(SEQ_グループID.nextval, 'フィナンシェ');
--- 商品名:フィナンシェ
insert into 商品マスタ(ID, 商品名, ジャンルID, 定価)
values(SEQ_商品ID.nextval, 'フィナンシェ', SEQ_グループID.currval, 140);
--- 商品名:ショコラフィナンシェ
insert into 商品マスタ(ID, 商品名, ジャンルID, 定価)
values(SEQ_商品ID.nextval, 'ショコラフィナンシェ', SEQ_グループID.currval, 170);
--- ジャンル名:ケーキ
insert into ジャンルマスタ(ID, ジャンル名) values(SEQ_グループID.nextval, 'ケーキ');
--- 商品名:キャラメルフロマージュ
insert into 商品マスタ(ID, 商品名, ジャンルID, 定価)
values(SEQ_商品ID.nextval, 'キャラメルフロマージュ', SEQ_グループID.currval, 600);
--- 商品名:ザッハトルテ
insert into 商品マスタ(ID, 商品名, ジャンルID, 定価)
values(SEQ_商品ID.nextval, 'ザッハトルテ', SEQ_グループID.currval, 1200);
--- 商品名:モンブラン
insert into 商品マスタ(ID, 商品名, ジャンルID, 定価)
values(SEQ_商品ID.nextval, 'モンブラン', SEQ_グループID.currval, 600);
--- ジャンル名:クッキー
insert into ジャンルマスタ(ID, ジャンル名) values(SEQ_グループID.nextval, 'クッキー');
--- 商品名:サブレ3枚入り
insert into 商品マスタ(ID, 商品名, ジャンルID, 定価)
values(SEQ_商品ID.nextval, 'サブレ3枚入', SEQ_グループID.currval, 260);
--- 商品名:ビスキュイ5枚入り
insert into 商品マスタ(ID, 商品名, ジャンルID, 定価)
values(SEQ_商品ID.nextval, 'ビスキュイ5枚入', SEQ_グループID.currval, 550);
顧客マスタ
insert into 顧客マスタ(ID, 氏名) values(SEQ_顧客ID.nextval, '太郎');
insert into 顧客マスタ(ID, 氏名) values(SEQ_顧客ID.nextval, '次郎');
売上データ、売上詳細データ
--- 1件目
--- 売上データ
insert into 売上データ(ID, 顧客ID, 売上日)
values(SEQ_売上ID.nextval, (select ID FROM 顧客マスタ WHERE 氏名='太郎'), '2021-01-20');
--- 売上詳細データ
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='フィナンシェ'), 1);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ショコラフィナンシェ'), 2);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ビスキュイ5枚入'), 5);
--- 2件目
--- 売上データ
insert into 売上データ(ID, 顧客ID, 売上日)
values(SEQ_売上ID.nextval, (select ID FROM 顧客マスタ WHERE 氏名='次郎'), '2021-01-20');
--- 売上詳細データ
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ショコラフィナンシェ'), 4);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='キャラメルフロマージュ'), 4);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ザッハトルテ'), 1);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='サブレ3枚入'), 2);
--- 3件目
--- 売上データ
insert into 売上データ(ID, 顧客ID, 売上日)
values(SEQ_売上ID.nextval, (select ID FROM 顧客マスタ WHERE 氏名='太郎'), '2021-01-21');
--- 売上詳細データ
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ザッハトルテ'), 2);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='サブレ3枚入'), 3);
--- 4件目
--- 売上データ
insert into 売上データ(ID, 顧客ID, 売上日)
values(SEQ_売上ID.nextval, (select ID FROM 顧客マスタ WHERE 氏名='次郎'), '2021-01-21');
--- 売上詳細データ
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='フィナンシェ'), 3);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ショコラフィナンシェ'), 2);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='モンブラン'), 2);
--- 5件目
--- 売上データ
insert into 売上データ(ID, 顧客ID, 売上日)
values(SEQ_売上ID.nextval, (select ID FROM 顧客マスタ WHERE 氏名='次郎'), '2021-01-21');
--- 売上詳細データ
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='フィナンシェ'), 6);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ザッハトルテ'), 1);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='モンブラン'), 3);
--- 6件目
--- 売上データ
insert into 売上データ(ID, 顧客ID, 売上日)
values(SEQ_売上ID.nextval, (select ID FROM 顧客マスタ WHERE 氏名='太郎'), '2021-01-22');
--- 売上詳細データ
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ショコラフィナンシェ'), 5);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='キャラメルフロマージュ'), 2);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='サブレ3枚入'), 2);
--- 7件目
--- 売上データ
insert into 売上データ(ID, 顧客ID, 売上日)
values(SEQ_売上ID.nextval, (select ID FROM 顧客マスタ WHERE 氏名='太郎'), '2021-01-23');
--- 売上詳細データ
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ショコラフィナンシェ'), 3,);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='サブレ3枚入'), 1);
insert into 売上詳細データ(売上ID, 商品ID, 数量)
values(SEQ_売上ID.currval, (select ID FROM 商品マスタ WHERE 商品名='ビスキュイ5枚入'), 1);
ビュー作成
ジャンル別売上金額
create or replace view ジャンル別売上金額(ジャンル名, 売上金額) as
select ジャンル名, sum(定価*数量)
from ジャンルマスタ, 商品マスタ, 売上詳細データ
where ジャンルマスタ.ID=商品マスタ.ジャンルID AND 商品マスタ.ID=売上詳細データ.商品ID
group by ジャンル名;
売上一覧
create or replace view 売上一覧(顧客名, 売上日, 売上金額, 商品数) as
select 氏名, 売上日, sum(定価*数量), sum(数量)
from 商品マスタ, 顧客マスタ, 売上データ, 売上詳細データ
where 売上データ.ID=売上詳細データ.売上ID and 商品マスタ.ID=売上詳細データ.商品ID and
顧客マスタ.ID=売上データ.顧客ID
group by 売上データ.ID, 氏名, 売上日
order by 売上日, sum(定価*数量);
最高売上数商品データ
create or replace view 最高売上数商品データ(商品名, ジャンル名, 売上数量) as
select 商品名, ジャンル名, sum(数量) AS 売上数量
from ジャンルマスタ, 商品マスタ, 売上データ, 売上詳細データ
where ジャンルマスタ.ID=商品マスタ.ジャンルID AND 売上データ.ID=売上詳細データ.売上ID AND
商品マスタ.ID=売上詳細データ.商品ID
group by 商品名, ジャンル名
having sum(数量) =
(select max(売上数量)
from (
select sum(数量) AS 売上数量
from 売上詳細データ
group by 商品ID
)
);
最高売上金額商品データ
create or replace view 最高売上金額商品データ(商品名, ジャンル名, 売上金額) as
select 商品名, ジャンル名, sum(定価*数量) AS 売上金額
from ジャンルマスタ, 商品マスタ, 売上データ, 売上詳細データ
where ジャンルマスタ.ID=商品マスタ.ジャンルID AND 売上データ.ID=売上詳細データ.売上ID AND
商品マスタ.ID=売上詳細データ.商品ID
group by 商品名, ジャンル名
having sum(定価*数量) =
(select max(売上金額)
from (
select sum(定価*数量) AS 売上金額
from 商品マスタ, 売上詳細データ
where 商品マスタ.ID=売上詳細データ.商品ID
group by 商品名
)
);
最高売上金額データ
create or replace view 最高売上金額データ(商品名, ジャンル名, 数量) as
select 商品名, ジャンル名, 数量
from ジャンルマスタ, 商品マスタ, 売上データ, 売上詳細データ
where ジャンルマスタ.ID=商品マスタ.ジャンルID AND 売上データ.ID=売上詳細データ.売上ID
AND 商品マスタ.ID=売上詳細データ.商品ID AND
売上データ.ID = (
select 売上詳細データ.売上ID
from 商品マスタ, 売上詳細データ
where 商品マスタ.ID=売上詳細データ.商品ID
group by 売上詳細データ.売上ID
having sum(定価*数量) =
(select max(売上金額)
from (
select 売上詳細データ.売上ID, sum(定価*数量) AS 売上金額
from 商品マスタ, 売上詳細データ
where 商品マスタ.ID=売上詳細データ.商品ID
group by 売上詳細データ.売上ID
)
)
);
コメント