-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTest scripts.sql
More file actions
210 lines (129 loc) · 7.74 KB
/
Test scripts.sql
File metadata and controls
210 lines (129 loc) · 7.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
--Used PostgreSQL
/*
Что нужно сделать:
1. Написать update запросы для предотвращения возможных ограничений и оптимизации изначальных таблиц. В комментариях укажите почему такие изменения нужны.
Ответы:
1. Так как Update является DML командой (используется для обновления существующих записей в таблице в базе данных, которых у нас нет на данный момент),
то с помощью нее нельзя изменять DDL объекты. Для того, чтобы изменить какие-либо ограничения (Constraints),необходимо использовать DDL команду ALTER.
Например:
*/
ALTER TABLE client ALTER COLUMN country DROP NOT NULL; -- можно сделать необязательным заполнение данного атрибута
ALTER TABLE rentbook RENAME COLUMN date TO rent_date;--лучше использовать другое название клонки, так date употребляется как тип данных
ALTER TABLE rentbook RENAME COLUMN time TO rent_time;--лучше использовать другое название клонки, так time употребляется как тип времени
ALTER TABLE rentbook ALTER COLUMN rent_date SET DEFAULT CURRENT_DATE;--можно упростить заполнение даты, если нужно указать текущую дату
ALTER TABLE servicebook ALTER COLUMN date SET DEFAULT CURRENT_DATE;--можно упростить заполнение даты, если нужно указать текущую дату
ALTER TABLE servicebook RENAME COLUMN date TO service_date;--лучше использовать другое название клонки, так date употребляется как тип данных
ALTER TABLE staff RENAME COLUMN date TO start_date;--лучше использовать другое название клонки, так date употребляется как тип данных
ALTER TABLE staff ALTER COLUMN passport DROP NOT NULL;-- можно сделать необязательным заполнение данного атрибута
ALTER TABLE staff ALTER COLUMN start_date SET DEFAULT CURRENT_DATE;--можно упростить заполнение даты, если нужно указать текущую дату
ALTER TABLE detail RENAME COLUMN type TO detail_type;--лучше использовать другое название клонки, так date употребляется как тип данных
-- также можно методоми выше поменять название колонок Name
/* 2. Разбить таблицы на меры и измерения.
* Ответ: Данные таблицы можно разбить на таблицы измерения и фактовую таблицу, которая в свою очередь содержит меры.
* Фактовая таблицы: rentbook, servicebook
* Таблицы измерения: staff, client, detail, bicycle, а detailforbicycle - это связующая таблица между таблицами detail и bicycle, так как у них связь
* между собой много ко многому.
*/
-- 3. Написать MDX скрипт создания OLAP куба из представленных таблиц.
--1)
SELECT r.id, r.rent_date, r.rent_time, r.paid, r.bicycleid, b.brand, b.rentprice,
r.clientid, c."name" AS client_name, c.passport AS client_passport, c.country AS client_country,
r.staffid, s."name" AS staff_name, s.passport AS staff_passport, s.start_date AS staff_start_date
FROM rentbook r
JOIN bicycle b ON r.bicycleid = b.id
JOIN client c ON r.clientid = c.id
JOIN staff s ON r.staffid = s.id;
--2)
SELECT b.brand AS bicycle_brand, sum(s.price) AS service_price, d."name" AS detail_name, st."name" AS staff_name
FROM servicebook s
JOIN bicycle b ON s.bicycleid = b.id
JOIN detail d ON s.detailid = d.id
JOIN staff st ON s.staffid = st.id
WHERE s.price > 2000
GROUP BY b.brand, d."name", st."name";
/*4. Написать 5 MDX произвольных запросов на отображение сводных данных. Как минимум два запроса должны затрагивать данные из четырех таблиц.
*/
--1)
SELECT *
FROM client c
WHERE c.country IN ('USA', 'Australia')
--2)
SELECT *
FROM rentbook r
WHERE r.rent_date = 2
--2)
SELECT st."name" AS staff_name, st.passport AS staff_passport, st.start_date AS staff_start_date
FROM staff s
WHERE st.start_date BETWEEN '2020-01-01' AND '2020-12-31'
--3)
SELECT r.rent_date, r.rent_time, r.paid, b.rentprice, c."name" AS client_name, s."name" AS staff_name
FROM rentbook r
JOIN bicycle b ON r.bicycleid = b.id
JOIN client c ON r.clientid = c.id
JOIN staff s ON r.staffid = s.id
WHERE r.paid = 0;
--4)
SELECT b.brand AS bicycle_brand, d.detail_type, d."name" AS detail_name, d.price AS detail_price,
s.staffid, st."name" AS staff_name, st.passport AS staff_passport, st.start_date AS staff_start_date
FROM servicebook s
JOIN bicycle b ON s.bicycleid = b.id
JOIN detail d ON s.detailid = d.id
JOIN staff st ON s.staffid = st.id;
-- создаем таблицы ниже
CREATE TABLE Bicycle
(
Id int GENERATED BY DEFAULT AS IDENTITY NOT NULL,
Brand varchar(50) NOT NULL,
RentPrice int NOT NULL, -- цена аренды
primary key(Id)
);
CREATE TABLE Client
(
Id int GENERATED BY DEFAULT AS IDENTITY NOT NULL,
Name varchar(10) NOT NULL,
Passport varchar(50) NOT NULL,
Country varchar(50) NOT NULL,
primary key(Id)
);
CREATE TABLE Staff
(
Id int GENERATED BY DEFAULT AS IDENTITY NOT NULL,
Name varchar(10) NOT NULL,
Passport varchar(50) NOT NULL,
Date date NOT NULL, -- дата начала работы
primary key(Id)
);
CREATE TABLE Detail -- запчасти велосипеда
(
Id int GENERATED BY DEFAULT AS IDENTITY NOT NULL,
Brand varchar(50) NOT NULL,
Type varchar(50) NOT NULL, -- тип детали (цепь, звезда, etc.)
Name varchar(50) NOT NULL, -- название детали
Price int NOT NULL,
primary key(Id)
);
CREATE TABLE DetailForBicycle -- список деталей подходящих к велосипедам
(
BicycleId int NOT NULL,
DetailId int NOT NULL,
FOREIGN KEY (BicycleId) REFERENCES Bicycle (Id), FOREIGN KEY (DetailId) REFERENCES Detail (Id)
);
CREATE TABLE ServiceBook -- сервисное обслуживание велосипедов
(
BicycleId int NOT NULL,
DetailId int NOT NULL,
Date date NOT NULL,
Price int NOT NULL, -- цена работы
StaffId int NOT NULL,
FOREIGN KEY (BicycleId) REFERENCES Bicycle (Id), FOREIGN KEY (StaffId) REFERENCES Staff (Id), FOREIGN KEY (DetailId) REFERENCES Detail (Id)
);
CREATE TABLE RentBook -- аренда велосипеда клиентом
(
Id int GENERATED BY DEFAULT AS IDENTITY NOT NULL,
Date date NOT NULL, -- дата аренды
Time int NOT NULL, -- время на сколько взята аренда в часах
Paid bit NOT NULL, -- 1 оплатил; 0 не оплатил
BicycleId int NOT NULL,
ClientId int NOT NULL,
StaffId int NOT NULL,
FOREIGN KEY (BicycleId) REFERENCES Bicycle (Id), FOREIGN KEY (StaffId) REFERENCES Staff (Id), FOREIGN KEY (ClientId) REFERENCES Client (Id) );