Функция для определения наиболее прибыльного хранилища из базы данных

#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 //