276 lines
9.1 KiB
SQL
276 lines
9.1 KiB
SQL
# MySQL Functions ІІ
|
||
Для роботи потрібна буде база даних jewelrystore_db з 4-ма таблицями.
|
||
|
||
############################################################
|
||
############################################################
|
||
Передумови:
|
||
|
||
Встановіть, якщо потрібно, базу даних та необхідні таблиці. Заповніть їх даними (якщо дані вже є, ппроведіть звірку даних)
|
||
------------------------------------------------------------
|
||
1. Створіть, якщо потрібно, базу даних та таблицю clients
|
||
|
||
CREATE DATABASE IF NOT EXISTS jewelrystore_db;
|
||
|
||
------------------------------------------------------------
|
||
1.1 Оберіть базу днахи
|
||
|
||
USE jewelrystore_db;
|
||
|
||
------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS clients (
|
||
ClientID int NOT NULL,
|
||
ClientName varchar(255) DEFAULT NULL,
|
||
Address varchar(255) DEFAULT NULL,
|
||
ContactNo varchar(10) DEFAULT NULL,
|
||
PRIMARY KEY (ClientID)
|
||
);
|
||
|
||
------------------------------------------------------------
|
||
2. Створіть балицю client_orders
|
||
|
||
CREATE TABLE IF NOT EXISTS client_orders (
|
||
OrderID INT NOT NULL,
|
||
ClientID INT DEFAULT NULL,
|
||
ItemID INT DEFAULT NULL,
|
||
Cost INT DEFAULT NULL,
|
||
PRIMARY KEY (OrderID)
|
||
);
|
||
|
||
------------------------------------------------------------
|
||
3. Створіть таблицю item.
|
||
|
||
CREATE TABLE IF NOT EXISTS item (
|
||
ItemID INT NOT NULL,
|
||
Name varchar(150) DEFAULT NULL,
|
||
Cost INT DEFAULT NULL,
|
||
PRIMARY KEY (ItemID)
|
||
);
|
||
|
||
------------------------------------------------------------
|
||
4. Створіть таблицю mg_orders
|
||
|
||
CREATE TABLE IF NOT EXISTS mg_orders (
|
||
OrderID INT NOT NULL,
|
||
ItemID INT DEFAULT NULL,
|
||
Quantity INT DEFAULT NULL,
|
||
Cost INT DEFAULT NULL,
|
||
OrderDate DATE DEFAULT NULL,
|
||
DeliveryDate DATE DEFAULT NULL,
|
||
OrderStatus VARCHAR(50) DEFAULT NULL,
|
||
PRIMARY KEY (OrderID)
|
||
);
|
||
|
||
------------------------------------------------------------
|
||
5. Додайте необхідні дані у таблицю clients
|
||
|
||
INSERT INTO
|
||
clients
|
||
VALUES (
|
||
1,
|
||
'Kishan Hughes',
|
||
'223 Golden Hills, North Austin, TX',
|
||
'387986345'
|
||
),
|
||
(
|
||
2,
|
||
'Indira Moncada',
|
||
'119 Silver Street, Bouldin Creek, TX',
|
||
'334567243'
|
||
),
|
||
(
|
||
3,
|
||
'Mosha Setsile',
|
||
'785 Bronze Lane, East Austin, TX',
|
||
'315642597'
|
||
),
|
||
(
|
||
4,
|
||
'Laura Mills',
|
||
'908 Diamond Crescent, South Lamar, TX',
|
||
'300842509'
|
||
),
|
||
(
|
||
5,
|
||
'Henrik Kreida',
|
||
'345, Golden Hills, North Austin, TX',
|
||
'358208983'
|
||
),
|
||
(
|
||
6,
|
||
'Millicent Blou',
|
||
'812, Diamond Crescent, North Burnet, TX',
|
||
'347898755'
|
||
);
|
||
|
||
------------------------------------------------------------
|
||
6. Додайте необхідні дані у таблицю item
|
||
|
||
INSERT INTO
|
||
item
|
||
VALUES (1, 'Engagement ring', 2500),
|
||
(2, 'Silver brooch', 400),
|
||
(3, 'Earrings', 350),
|
||
(4, 'Luxury watch', 1250),
|
||
(5, 'Golden bracelet', 800),
|
||
(6, 'Gemstone', 1500);
|
||
|
||
------------------------------------------------------------
|
||
7. Додайте необхідні дані у таблицю client_orders
|
||
|
||
INSERT INTO
|
||
client_orders
|
||
VALUES (1, 1, 1, 2500),
|
||
(2, 2, 2, 400),
|
||
(3, 3, 3, 350),
|
||
(4, 4, 4, 1250),
|
||
(5, 5, 5, 800),
|
||
(6, 6, 6, 1500),
|
||
(7, 2, 4, 400),
|
||
(8, 3, 4, 1250),
|
||
(9, 4, 2, 400),
|
||
(10, 1, 3, 350);
|
||
------------------------------------------------------------
|
||
8. Додайте необхідні дані у таблицю mg_orders
|
||
|
||
INSERT INTO
|
||
mg_orders
|
||
VALUES (
|
||
1,
|
||
1,
|
||
50,
|
||
122000,
|
||
'2022-04-05',
|
||
'2022-05-25',
|
||
'Delivered'
|
||
),
|
||
(
|
||
2,
|
||
2,
|
||
75,
|
||
28000,
|
||
'2022-03-08',
|
||
NULL,
|
||
'In progress'
|
||
),
|
||
(
|
||
3,
|
||
3,
|
||
80,
|
||
25000,
|
||
'2022-05-19',
|
||
'2022-06-08',
|
||
'Delivered'
|
||
),
|
||
(
|
||
4,
|
||
4,
|
||
45,
|
||
100000,
|
||
'2022-01-10',
|
||
NULL,
|
||
'In progress'
|
||
),
|
||
(
|
||
5,
|
||
5,
|
||
70,
|
||
56000,
|
||
'2022-05-19',
|
||
NULL,
|
||
'In progress'
|
||
),
|
||
(
|
||
6,
|
||
6,
|
||
60,
|
||
90000,
|
||
'2022-06-10',
|
||
'2022-06-18',
|
||
'Delivered'
|
||
);
|
||
|
||
#########################################################
|
||
#################### Завдання 1: ####################
|
||
Клієнтам, які замовили luxury watches надали 5% знижку.
|
||
На основі таблиць client_orders та item виведіть інформацію про ці замовлення.
|
||
У вибірку включіть ІД клієнта, ІД замовлення та вартість після знижки (afterDiscount).
|
||
Використайте математичну фукнцію CEIL щоб заокруглити вартість замовлення після знижки до найменшого
|
||
цілого, яке не менше вартості замовлення після знижки.
|
||
Очікуваний вигляд вибірки: https://drive.google.com/open?id=15xthe7YF52eewjLfCFtPD7X0fermHxbO&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs
|
||
|
||
ClientID, OrderID, afterDiscount
|
||
|
||
SELECT client_orders.ClientID, client_orders.OrderID, CEIL(client_orders.Cost * 0.95) AS afterDiscount
|
||
FROM client_orders
|
||
JOIN item ON client_orders.ItemID = item.ItemID
|
||
WHERE
|
||
LOWER(item.Name) = LOWER('luxury watch');
|
||
|
||
#########################################################
|
||
#################### Завдання 2: ####################
|
||
|
||
Використайте запит з попереднього завдання, щоб відформатувати поле afterDiscount відповідно до маски
|
||
'#,###,###.##' з двома знаками після коми використавши функцію FORMAT function.
|
||
Очікуваний вигляд вибірки: https://drive.google.com/open?id=15yn9iYpMyBcRld1wXpmrKkbH6o6Z8hBp&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs
|
||
|
||
ClientID, OrderID, afterDiscount
|
||
|
||
SELECT client_orders.ClientID, client_orders.OrderID, FORMAT(
|
||
CEIL(client_orders.Cost * 0.95), 2
|
||
) AS afterDiscount
|
||
FROM client_orders
|
||
JOIN item ON client_orders.ItemID = item.ItemID
|
||
WHERE
|
||
LOWER(item.Name) = LOWER('luxury watch');
|
||
|
||
#########################################################
|
||
#################### Завдання 3: ####################
|
||
Знайдіть очікувану дату доставки для замовлень. Запланований час доставки 30 днів після дати замовлення.
|
||
Використайте для цього фукнкцію ADDDATE.
|
||
Очікуваний вигляд вибірки: https://drive.google.com/open?id=15zmq2p19Gua485l0hki9lQrVqBYb1N3-&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs
|
||
|
||
ExpectedDelivDate
|
||
|
||
SELECT ADDDATE(OrderDate, 30) AS ExpectedDelivDate FROM mg_orders;
|
||
|
||
#########################################################
|
||
#################### Завдання 4: ####################
|
||
Згенеруйте дані, необхідні для звіту з деталями всіх замовлень.
|
||
Для замовлень, які ще не доставлені, стовпець DeliveryDate має значення NULL.
|
||
У цьому стовпці відобразіть значення "NOT DELIVERED" замість NULL для замовлень,
|
||
які ще не доставлено. Для цього використайте функцію COALESCE.
|
||
Очікуваний вигляд вибірки: https://drive.google.com/open?id=160knbiH6JD_-0s36txaxzC5m2BEuhGLq&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs
|
||
|
||
OrderID,ItemID,Quantity,Cost,OrderDate,DeliveryDate,OrderStatus
|
||
|
||
SELECT
|
||
OrderID,
|
||
ItemID,
|
||
Quantity,
|
||
Cost,
|
||
OrderDate,
|
||
COALESCE(DeliveryDate, 'NOT DELIVERED') AS DeliveryDate,
|
||
OrderStatus
|
||
FROM mg_orders;
|
||
|
||
#########################################################
|
||
#################### Завдання 5: ####################
|
||
Згенеруйте дані, необхідні для звіту, отримавши список усіх замовлень.
|
||
Замовлення які ще не доставлені мають статус "In progress".
|
||
За допомогою функції NULLIF згенеруйте дані таким чиному, щоб у стовпці OrderStatus
|
||
замість "In progress" відображалося значення null.
|
||
Очікуваний вигляд вибірки: https://drive.google.com/open?id=163dVCzWR9Vw3QY3QWmh8C34W1QX5kBrS&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs
|
||
|
||
OrderID, ItemID, Quantity, Cost, OrderDate, DeliveryDate, OrderStatus
|
||
|
||
SELECT
|
||
OrderID,
|
||
ItemID,
|
||
Quantity,
|
||
Cost,
|
||
OrderDate,
|
||
DeliveryDate,
|
||
NULLIF(OrderStatus, 'In progress') AS OrderStatus
|
||
FROM mg_orders;
|
||
|
||
######################################################### |