Загрузка данных
-- ============================================
-- 1 ЗАДАНИЕ: Функция для определения ценовой категории
-- ============================================
DELIMITER $$
CREATE FUNCTION get_price_category(price DECIMAL(10,2))
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE category VARCHAR(20);
IF price < 5000 THEN
SET category = 'Дешевый';
ELSEIF price >= 5000 AND price <= 80000 THEN
SET category = 'Средний';
ELSE
SET category = 'Дорогой';
END IF;
RETURN category;
END$$
DELIMITER ;
-- ============================================
-- 2 ЗАДАНИЕ: Список товаров + их категория
-- ============================================
SELECT
name AS 'Товар',
price AS 'Цена',
get_price_category(price) AS 'Категория цены'
FROM products;
-- ============================================
-- 3 ЗАДАНИЕ: Только "Дорогие" товары
-- ============================================
SELECT
name AS 'Товар',
price AS 'Цена',
get_price_category(price) AS 'Категория цены'
FROM products
WHERE get_price_category(price) = 'Дорогой';
-- ============================================
-- 4 ЗАДАНИЕ: Функция - цена товара по id
-- ============================================
DELIMITER $$
CREATE FUNCTION get_product_price(product_id INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE prod_price DECIMAL(10,2);
SELECT price INTO prod_price
FROM products
WHERE id = product_id;
RETURN prod_price;
END$$
DELIMITER ;
-- Пример использования:
SELECT
id,
name,
get_product_price(id) AS 'Цена'
FROM products;
-- ============================================
-- 5 ЗАДАНИЕ: Функция - категория товара (через функцию из 1 задания)
-- ============================================
DELIMITER $$
CREATE FUNCTION get_product_category(product_id INT)
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE prod_price DECIMAL(10,2);
DECLARE prod_category VARCHAR(20);
SELECT price INTO prod_price
FROM products
WHERE id = product_id;
SET prod_category = get_price_category(prod_price);
RETURN prod_category;
END$$
DELIMITER ;
-- Пример использования:
SELECT
id,
name,
price,
get_product_category(id) AS 'Категория товара'
FROM products;
-- ============================================
-- 6 ЗАДАНИЕ: Функция - итоговая сумма (количество * цена)
-- ============================================
DELIMITER $$
CREATE FUNCTION calculate_total_amount(quantity INT, price DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN quantity * price;
END$$
DELIMITER ;
-- Пример использования:
SELECT
product_id,
quantity,
get_product_price(product_id) AS 'Цена',
calculate_total_amount(quantity, get_product_price(product_id)) AS 'Сумма'
FROM order_items;
-- ============================================
-- 7 ЗАДАНИЕ: Функция - общая сумма заказа
-- ============================================
DELIMITER $$
CREATE FUNCTION get_order_total(order_id_param INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(calculate_total_amount(oi.quantity, p.price)) INTO total
FROM order_items oi
JOIN products p ON oi.product_id = p.id
WHERE oi.order_id = order_id_param;
RETURN IFNULL(total, 0);
END$$
DELIMITER ;
-- Пример использования:
SELECT
id AS 'ID заказа',
get_order_total(id) AS 'Общая сумма'
FROM orders;
-- ============================================
-- 8 ЗАДАНИЕ: Функция - скидка от суммы заказа
-- ============================================
DELIMITER $$
CREATE FUNCTION get_discount_by_amount(order_amount DECIMAL(10,2))
RETURNS DECIMAL(5,2)
DETERMINISTIC
BEGIN
DECLARE discount_percent DECIMAL(5,2);
IF order_amount >= 100000 THEN
SET discount_percent = 10.00;
ELSEIF order_amount >= 50000 THEN
SET discount_percent = 5.00;
ELSE
SET discount_percent = 0.00;
END IF;
RETURN discount_percent;
END$$
DELIMITER ;
-- Пример использования:
SELECT
get_order_total(1) AS 'Сумма заказа',
get_discount_by_amount(get_order_total(1)) AS 'Скидка %';
-- ============================================
-- 9 ЗАДАНИЕ: Функция - итог заказа с учетом скидки
-- ============================================
DELIMITER $$
CREATE FUNCTION get_final_order_total(order_id_param INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE order_total DECIMAL(10,2);
DECLARE discount_percent DECIMAL(5,2);
DECLARE final_total DECIMAL(10,2);
-- Получаем сумму заказа
SET order_total = get_order_total(order_id_param);
-- Получаем скидку
SET discount_percent = get_discount_by_amount(order_total);
-- Рассчитываем итоговую сумму со скидкой
SET final_total = order_total * (1 - discount_percent / 100);
RETURN final_total;
END$$
DELIMITER ;
-- Пример использования:
SELECT
id AS 'ID заказа',
get_order_total(id) AS 'Сумма без скидки',
get_discount_by_amount(get_order_total(id)) AS 'Скидка %',
get_final_order_total(id) AS 'Итог со скидкой'
FROM orders;
-- ============================================
-- 10 ЗАДАНИЕ: Функция - наличие товара
-- ============================================
DELIMITER $$
CREATE FUNCTION get_stock_status(product_id INT)
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE product_stock INT;
DECLARE status_message VARCHAR(20);
SELECT stock INTO product_stock
FROM products
WHERE id = product_id;
IF product_stock = 0 THEN
SET status_message = 'Нет в наличии';
ELSEIF product_stock < 5 THEN
SET status_message = 'Мало';
ELSE
SET status_message = 'Достаточно';
END IF;
RETURN status_message;
END$$
DELIMITER ;
-- Пример использования:
SELECT
id,
name,
stock,
get_stock_status(id) AS 'Статус наличия'
FROM products;
-- Полный отчет по товарам
SELECT
p.id,
p.name,
p.price AS 'Цена',
get_price_category(p.price) AS 'Ценовая категория',
get_stock_status(p.id) AS 'Наличие',
p.stock AS 'Кол-во на складе'
FROM products p;
-- Полный отчет по заказам
SELECT
o.id AS 'Заказ №',
o.order_date AS 'Дата',
o.status AS 'Статус',
get_order_total(o.id) AS 'Сумма',
get_discount_by_amount(get_order_total(o.id)) AS 'Скидка',
get_final_order_total(o.id) AS 'Итого к оплате'
FROM orders o;