#mysql #sql #database #function
#mysql #sql #База данных #функция
Вопрос:
Я должен создать функцию MySQL, которая получает индекс и возвращает название магазина в этом индексе, упорядоченное по прибыли. Как мне настроить функцию?
Это запрос, который я выполнил, чтобы заказать магазин на основе прибыли, которая представляет собой общую сумму проданных товаров, умноженную на количество запасов.
SELECT name, (SUM(price * quantity)) AS TotalPrice
FROM Items NATURAL JOIN Inventory
GROUP BY name
ORDER BY (TotalPrice) DESC;
Схема:
Инвентарь (имя: строка, элемент: строка, количество: целое число)
Элементы (элемент: строка, бренд: строка, цена: двойная)
Ошибка: используемый оператор Select имеет другое количество столбцов.
Я должен быть в состоянии вернуть n-е наиболее прибыльное хранилище. Команда MySQL У меня есть функции для создания представления по порядку, но я не знаю, как вернуть индекс упорядоченной таблицы. Это не домашнее задание, просто обзор для экзамена.
Комментарии:
1. Прибыль — это не цена, умноженная на количество. Это будет валовой доход.
2. Что ж, результат, выдаваемый этим запросом, является желаемым результатом, мне нужно найти наиболее прибыльный магазин, прибыль, основанная на схеме, а не на фактическом определении, будет СУММОЙ (цена * количество каждого товара в каждом магазине. Просто хотел создать функцию, которая возвращает n-е наиболее прибыльное хранилище, но застрял на том, как это сделать.
Ответ №1:
Я смог создать процедуру, но не функцию, которая дает мне результат, который я хотел, с помощью следующего кода:
DELIMITER |
CREATE PROCEDURE m2(IN N INTEGER)
BEGIN
SELECT name, (SUM(price * quantity)) AS Total_Profit
FROM Items JOIN
Inventory
USING (item)
GROUP BY name
ORDER BY Total_Profit DESC
LIMIT N, 1;
END |
Ответ №2:
Вы можете получить n-й элемент в списке, используя OFFSET
и LIMIT
:
SELECT name, (SUM(price * quantity)) AS TotalPrice
FROM Items JOIN
Inventory
USING (item)
GROUP BY name
ORDER BY TotalPrice DESC
OFFSET <n - 1> LIMIT 1
Итак, для 3-го элемента это было бы:
OFFSET 2 LIMIT 1
Обратите внимание, что я удалил NATURAL JOIN
. Я рекомендую никогда не использовать NATURAL JOIN
s, потому что код не показывает JOIN
ключи (и поэтому подвержен ошибкам) и потому что они не учитывают должным образом объявленные отношения внешнего ключа.
Комментарии:
1. Хорошо, потрясающе, спасибо, это имеет больше смысла. Как бы я поступил при создании функции: DELIMITER // CREATE FUNCTION mostProfit(n INT(10)) BEGIN ВЫБЕРИТЕ имя, (СУММА (цена * количество)) КАК TotalPrice ИЗ Items ПРИСОЕДИНЯЕТСЯ К инвентарю С ПОМОЩЬЮ (item) ГРУППИРОВАТЬ По порядку имен С ПОМОЩЬЮ TotalPrice DESC LIMIT 1, n; END //