USE trade_company;
-- 1. Список товаров, проданных за определенный период
-- В качестве примера взят период с 2026-06-01 по 2026-06-05
SELECT
s.data_prod AS 'Дата продажи',
s.k_tov AS 'Код товара',
p.n_tov AS 'Наименование товара',
s.v_prod AS 'Объем продажи',
s.cena_prod AS 'Цена продажи',
(s.v_prod * s.cena_prod) AS 'Общая стоимость (v_prod*cena_prod)',
m.fio AS 'ФИО менеджера'
FROM sales s
JOIN products p ON s.k_tov = p.k_tov
JOIN managers m ON s.km = m.km
WHERE s.data_prod BETWEEN '2026-06-01' AND '2026-06-05';
-- 2. Список товаров с ценой продажи, превышающей среднюю цену товаров
SELECT
p.n_tov AS 'Наименование товара',
s.k_tov AS 'Код товара',
s.cena_prod AS 'Цена продажи',
(SELECT ROUND(AVG(cena_prod), 2) FROM sales) AS 'Средняя цена всех товаров'
FROM sales s
JOIN products p ON s.k_tov = p.k_tov
WHERE s.cena_prod > (SELECT AVG(cena_prod) FROM sales);
-- 3. Список товаров, которые есть в прайсе (номенклатуре), но отсутствуют на складе (kol = 0)
-- Чтобы запрос что-то вывел, сначала искусственно обнулим количество одного из товаров:
UPDATE products SET kol = 0 WHERE k_tov = 5;
-- Сам запрос на выборку отсутствующих товаров:
SELECT
k_tov AS 'Код товара',
n_tov AS 'Наименование товара',
kol AS 'Количество на складе'
FROM products
WHERE kol = 0;
-- 4. Увеличить цену поставки товара с заданным наименованием на 15%
-- В качестве примера увеличим цену для товара 'Фильтр масляный'
UPDATE deliveries d
JOIN products p ON d.k_tov = p.k_tov
SET d.cena_post = d.cena_post * 1.15
WHERE p.n_tov = 'Фильтр масляный';
-- Проверить результат изменения цены поставки:
SELECT p.n_tov, d.cena_post
FROM deliveries d
JOIN products p ON d.k_tov = p.k_tov
WHERE p.n_tov = 'Фильтр масляный';
USE trade_company;
DROP TRIGGER IF EXISTS after_delivery_insert;
DELIMITER //
CREATE TRIGGER after_delivery_insert
AFTER INSERT ON deliveries
FOR EACH ROW
BEGIN
-- Проверяем, существует ли уже товар с таким кодом в таблице продуктов
IF EXISTS (SELECT 1 FROM products WHERE k_tov = NEW.k_tov) THEN
-- Если товар есть, увеличиваем его количество на складе на величину объема поставки
UPDATE products
SET kol = kol + NEW.v_post
WHERE k_tov = NEW.k_tov;
ELSE
-- Если товара нет, добавляем новую запись в номенклатуру товаров
-- (Примечание: сработает, если код товара генерируется вручную или проверка FK временно отключена)
INSERT INTO products (k_tov, n_tov, kol)
VALUES (NEW.k_tov, 'Новый поступивший товар', NEW.v_post);
END IF;
END //
DELIMITER ;
-- ====================================================================
-- ДЕМОНСТРАЦИЯ РАБОТЫ ТРИГГЕРА (Проверка)
-- ====================================================================
-- 1. Посмотрим текущее количество товара с k_tov = 1 (было 45)
SELECT n_tov, kol FROM products WHERE k_tov = 1;
-- 2. Имитируем новую поставку этого товара объемом 15 штук
INSERT INTO deliveries (k_Post, k_tov, data_past, v_post, cena_post)
VALUES (1, 1, '2026-06-11', 15, 1200.00);
-- 3. Проверяем склад снова (количество должно автоматически стать 60)
SELECT n_tov, kol FROM products WHERE k_tov = 1;