-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmainScripts.sql
382 lines (286 loc) · 9.6 KB
/
mainScripts.sql
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
DROP DATABASE IF EXISTS `bedirhan_bardakci`;
CREATE DATABASE IF NOT EXISTS bedirhan_bardakci;
USE bedirhan_bardakci;
CREATE TABLE IF NOT EXISTS district (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(30) NOT NULL UNIQUE
);
CREATE TABLE IF NOT EXISTS city (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
district_id INT(6) NOT NULL,
title VARCHAR(30) NOT NULL UNIQUE
);
ALTER TABLE city
ADD FOREIGN KEY (district_id) REFERENCES district(id);
CREATE TABLE IF NOT EXISTS branch (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
city_id INT(6) NOT NULL,
title VARCHAR(30) NOT NULL
);
ALTER TABLE branch
ADD FOREIGN KEY (city_id) REFERENCES city(id);
CREATE TABLE IF NOT EXISTS customer (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
forename VARCHAR(30) NOT NULL,
surname VARCHAR(30) NOT NULL
);
CREATE TABLE IF NOT EXISTS salesman (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
branch_id INT(6) NOT NULL,
forename VARCHAR(30) NOT NULL,
surname VARCHAR(30) NOT NULL
);
ALTER TABLE salesman
ADD FOREIGN KEY (branch_id) REFERENCES branch(id);
CREATE TABLE IF NOT EXISTS book (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
price INT(6) NOT NULL
);
CREATE TABLE IF NOT EXISTS stock (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
branch_id INT(6) NOT NULL,
book_id INT(6) NOT NULL,
isSold INT(6) DEFAULT 0
);
ALTER TABLE stock
ADD FOREIGN KEY (branch_id) REFERENCES branch(id);
ALTER TABLE stock
ADD FOREIGN KEY (book_id) REFERENCES book(id);
CREATE TABLE IF NOT EXISTS sale (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
customer_id INT(6) NOT NULL,
salesman_id INT(6) NOT NULL,
stock_id INT(6) NOT NULL,
amount INT(6) NOT NULL,
saledate DATETIME NOT NULL
);
ALTER TABLE sale
ADD FOREIGN KEY (customer_id) REFERENCES customer(id);
ALTER TABLE sale
ADD FOREIGN KEY (salesman_id) REFERENCES salesman(id);
ALTER TABLE sale
ADD FOREIGN KEY (stock_id) REFERENCES stock(id);
CREATE TABLE IF NOT EXISTS temp (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
district_name VARCHAR(30) NOT NULL,
city_name VARCHAR(30) NOT NULL,
branch_name VARCHAR(30) NOT NULL
);
LOAD DATA INFILE 'C:\\Program Files\\Ampps\\www\\CSE348\\turkey.csv'
IGNORE INTO TABLE temp
FIELDS TERMINATED BY ';'
ENCLOSED BY ''
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@col1, @col2, @col3)
set district_name = TRIM(@col1),
city_name = TRIM(@col2),
branch_name = TRIM(@col3);
CREATE TABLE IF NOT EXISTS tempSalesman (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
forename VARCHAR(30) NOT NULL,
surname VARCHAR(30) NOT NULL
);
LOAD DATA INFILE 'C:\\Program Files\\Ampps\\www\\CSE348\\salesman.csv'
IGNORE INTO TABLE tempSalesman
FIELDS TERMINATED BY ';'
ENCLOSED BY ''
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@col1, @col2)
set forename = TRIM(@col1),
surname = TRIM(@col2);
CREATE TABLE IF NOT EXISTS tempCustomer (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
forename VARCHAR(30) NOT NULL,
surname VARCHAR(30) NOT NULL
);
LOAD DATA INFILE 'C:\\Program Files\\Ampps\\www\\CSE348\\customer.csv'
IGNORE INTO TABLE tempCustomer
FIELDS TERMINATED BY ';'
ENCLOSED BY ''
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@col1, @col2)
set forename = TRIM(@col1),
surname = TRIM(@col2);
CREATE TABLE IF NOT EXISTS tempBook (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
price INT(6) NOT NULL
);
LOAD DATA INFILE 'C:\\Program Files\\Ampps\\www\\CSE348\\books.csv'
IGNORE INTO TABLE tempBook
FIELDS TERMINATED BY ';'
ENCLOSED BY ''
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@col1, @col2)
set title = TRIM(@col1),
price = TRIM(@col2);
INSERT INTO district (title)
SELECT district_name FROM temp
group by district_name;
INSERT INTO city (district_id, title)
SELECT d.id
, t.city_name
FROM temp t
JOIN district d ON d.title = t.district_name
Group by d.id
, t.city_name;
INSERT INTO branch (city_id, title)
SELECT c.id
, t.branch_name
FROM temp t
JOIN city c ON c.title = t.city_name
Group by c.id
, t.branch_name;
INSERT INTO customer (forename, surname)
SELECT forename
, surname
FROM tempCustomer;
SET @row_number = 0;
INSERT INTO salesman (branch_id, forename, surname)
SELECT ceil((@row_number:=@row_number + 1) / 4) AS num,
forename,
surname
FROM tempsalesman
Limit 1600;
INSERT INTO book (title, price)
SELECT title
, price
FROM tempBook;
CREATE TABLE IF NOT EXISTS tempStocks (
branch_id INT(6) NOT NULL,
stock INT(6) NOT NULL
);
Drop Procedure IF EXISTS procedure_SimulateStocks;
-- DELIMITER $$
-- CREATE PROCEDURE procedure_SimulateStocks()
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedure_SimulateStocks`()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE stockCount INT DEFAULT 0;
DECLARE branchId INT DEFAULT 0;
DECLARE c1 CURSOR FOR
-- Generate random number between 40 and 500 for every branch
SELECT id,
(FLOOR( 40 + RAND( ) *461 )) AS stockCount
FROM branch;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN c1;
WHILE NOT done DO
-- yukarıda attığımız selectin sonucunu branchId ve kitap sayısı olarak stock table'ına kaydediyoruz
FETCH NEXT FROM c1 INTO branchId, stockCount;
IF (done = FALSE ) THEN -- Prevent Last row of inner cursor fetched twice
Insert Into stock (branch_id, book_id)
SELECT branchId,
id as bookId
FROM book
ORDER BY RAND()
LIMIT stockCount;
END IF;
END WHILE;
CLOSE c1;
END;
-- END$$
-- DELIMITER ;
CALL procedure_SimulateStocks();
CREATE TABLE IF NOT EXISTS tampRandomCustomers (
id INT(6) NULL
);
DROP PROCEDURE IF EXISTS procedure_SimulateSales;
SET @row_number = 0;
-- DELIMITER $$
-- CREATE PROCEDURE procedure_SimulateSales()
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedure_SimulateSales`()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE branchCount INT DEFAULT (Select Count(1) from branch);
DECLARE customerID INT DEFAULT 0;
DECLARE branchID INT DEFAULT 0;
DECLARE stockID INT DEFAULT 0;
DECLARE bookAmount INT DEFAULT 0;
DECLARE totalStock INT DEFAULT 0;
DECLARE minDate DATETIME DEFAULT '2020-04-30 14:53:27';
DECLARE maxDate DATETIME DEFAULT '2021-04-30 14:53:27';
DECLARE c1 CURSOR FOR
-- Generate random number between 40 and 500 for every branch
SELECT id as customerID,
CASE
WHEN @row_number < branchCount THEN @row_number:=@row_number + 1
ELSE @row_number:=@row_number + 1 - branchCount
END as branchID,
(FLOOR( 10 + RAND( ) *10 )) AS bookAmount
FROM bedirhan_bardakci.tampRandomCustomers;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- not found olursa true yap
CREATE TABLE IF NOT EXISTS tampRandomCustomers (
id INT(6) NULL
);
Delete from bedirhan_bardakci.tampRandomCustomers;
INSERT INTO bedirhan_bardakci.tampRandomCustomers (id )
SELECT id
FROM bedirhan_bardakci.customer
order by RAND();
OPEN c1;
WHILE NOT done DO
FETCH NEXT FROM c1 INTO customerID, branchID, bookAmount;
SELECT Count(1) into totalStock FROM bedirhan_bardakci.stock where branch_id = branchID and isSold = 0;
IF (done = FALSE ) THEN -- Prevent Last row of inner cursor fetched twice
WHILE bookAmount > 0 and totalStock > 0 DO
SELECT id
into stockID
FROM bedirhan_bardakci.stock
where branch_id = branchID
and isSold = 0
LIMIT 1;
INSERT INTO bedirhan_bardakci.sale (customer_id, salesman_id, stock_id, amount, saledate)
VALUES (
customerID,
(select id from bedirhan_bardakci.salesman where branch_id = branchID order by RAND() LIMIT 1),
stockID,
1,
(SELECT TIMESTAMPADD(SECOND, FLOOR(RAND() * TIMESTAMPDIFF(SECOND, minDate, maxDate)), minDate))
);
Update bedirhan_bardakci.stock set isSold = 1 where id = stockID;
SET bookAmount = bookAmount - 1;
SET totalStock = totalStock - 1;
END WHILE;
END IF;
END WHILE;
CLOSE c1;
DROP TABLE IF EXISTS tampRandomCustomers;
END;
-- END$$
-- DELIMITER ;
CALL procedure_SimulateSales();
-- Remove Temps
DROP TABLE IF EXISTS tempStocks;
DROP TABLE IF EXISTS temp;
DROP TABLE IF EXISTS tempCustomer;
DROP TABLE IF EXISTS tempSalesman;
DROP TABLE IF EXISTS tempBook;
DROP TABLE IF EXISTS tampRandomCustomers;
-- NOTLAR
-- 5 den az ilçesi olan şehirler
-- SELECT count(b.city_id) , c.title
-- FROM branch b
-- join city c on c.id = b.city_id
-- group by b.city_id , c.title
-- having count(b.city_id) < 5
-- TEST
-- SELECT d.title,c.title, b.title FROM branch b
-- JOIN city c on c.id = b.city_id
-- JOIN district d on d.id = c.district_id
-- SELECT branch_id, count(book_id)
-- FROM bedirhan_bardakci.stock
-- group by branch_id
-- order by 2 desc
-- LOAD DATA INFILE 'C:\\Program Files\\Ampps\\www\\CSE348\\turkey.csv'
-- IGNORE INTO TABLE city
-- FIELDS TERMINATED BY ';'
-- ENCLOSED BY ''
-- LINES TERMINATED BY '\n'
-- (@col1, @col2, @col3)
-- set title = TRIM(@col2);