Загрузка данных



DELIMITER //

CREATE FUNCTION GetAveragePriceInOrder(p_order_id INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
READS SQL DATA
BEGIN
    DECLARE avg_price DECIMAL(10,2);
    
    -- Вычисляем среднюю цену товаров в заказе
    SELECT AVG(p.price) INTO avg_price
    FROM order_items oi
    JOIN products p ON oi.product_id = p.id
    WHERE oi.order_id = p_order_id;
    
    -- Если в заказе нет товаров, возвращаем 0
    IF avg_price IS NULL THEN
        RETURN 0;
    ELSE
        RETURN avg_price;
    END IF;
END //

DELIMITER ;


DELIMITER //

CREATE PROCEDURE UpdateCustomerDiscountByOrder(IN p_order_id INT)
BEGIN
    DECLARE v_avg_price DECIMAL(10,2);
    DECLARE v_customer_id INT;
    DECLARE v_current_discount DECIMAL(5,2);
    
    -- Получаем ID клиента из заказа (используем JOIN)
    SELECT o.customer_id INTO v_customer_id
    FROM orders o
    WHERE o.id = p_order_id;
    
    -- Если заказ не найден, выходим
    IF v_customer_id IS NULL THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Order not found';
    END IF;
    
    -- Вызываем функцию для получения средней цены товаров в заказе
    SET v_avg_price = GetAveragePriceInOrder(p_order_id);
    
    -- Условная конструкция: если средняя цена > 70000
    IF v_avg_price > 70000 THEN
        -- Получаем текущую скидку клиента (SELECT INTO)
        SELECT discount INTO v_current_discount
        FROM customers
        WHERE id = v_customer_id;
        
        -- Увеличиваем скидку на 5%
        UPDATE customers
        SET discount = v_current_discount + 5
        WHERE id = v_customer_id;
        
        -- Выводим информационное сообщение
        SELECT CONCAT('Скидка увеличена. Новая скидка: ', 
                      v_current_discount + 5, '%') AS Message;
    ELSE
        -- Сообщение, если условие не выполнено
        SELECT CONCAT('Средняя цена (', v_avg_price, 
                      ') не превышает 70000. Скидка не изменена.') AS Message;
    END IF;
END //

DELIMITER ;