Есть определенная сумма, нужно вычислить с помощью процедуры, какое количество товара можно за нее купить. Количество товара на складе ограничено, это тоже необходимо учитывать.
SELECT quantity, price FROM Goods WHERE ID=1;
Произвожу селект и получаю количество и цену товара с нужным ID. Как действовать дальше с полученными данными? Могу я использовать quantity, price как переменные и дальше производить операции с ними так же, как в языках программирования?
SQL
Microsoft SQL Процедура получения количества товара на определенную сумму. Использование переменных после SELECT?
да, конечно:
DECLARE
@quantity integer,
@price money
SELECT
@quantity = quantity,
@price = price
FROM Goods WITH(NOLOCK)
WHERE
ID=1
только зачем процедура? лучше функция, возвращающая табличное значение.
ну раз надо процедуру - пусть будет процедура
CREATE PROCEDURE dbo.[Какое количество товара я могу купить] (
@Sum money
)
AS
BEGIN
-- объявляем "корзинку" - табличную переменную,
-- в которую будем сгружать отобранные товары
DECLARE @selected_goods TABLE (
ID uniqueidentifier,
quantity integer,
price money
),
-- объявляем всякие вспомогательные переменные
@ID uniqueidentifier,
@quantity integer,
@quantity_to_buy integer,
@price money
-- объявляем курсор, вытаскивающий товары в наличии по убыванию цены
DECLARE goodsCur CURSOR LOCAL STATIC FOR
SELECT
ID,
quantity,
price
FROM
Goods WITH(NOLOCK)
WHERE
quantity > 0
ORDER BY
price DESC
-- открываем курсор
OPEN goodsCur
-- вытаскиваем из курсора очередную запись в локальные переменные
FETCH NEXT FROM goodsCur INTO @ID, @quantity, @price
-- цикл, пока курсор не дошел до конца и пока есть деньги
WHILE @@fetch_status = 0 AND @Sum > 0
BEGIN
-- считаем, сколько товара можно купить
SET @quantity_to_buy = @Sum / @price
IF @quantity_to_buy > @quantity SET @quantity_to_buy = @quantity
-- если товар можно купить, заносим его в корзинку
IF @quantity_to_buy > 0
BEGIN
INSERT INTO @selected_goods (ID, quantity, price)
VALUES (@ID, @quantity_to_buy, @price)
SET @Sum = @Sum - @quantity_to_buy * @price
END
-- вытаскиваем из курсора следующую запись
FETCH NEXT FROM goodsCur INTO @ID, @quantity, @price
END
-- конец цикла
-- закрываем ненужный курсор
CLOSE goodsCur
-- освобождаем ресурсы, занятые ненужным курсором
DEALLOCATE goodsCur
-- отдаем во внешний мир содержимое корзинки
SELECT * FROM @selected_goods
END
примерно так.
в синтаксисе навернякагде-нибудь напутано, но смысл, надеюсь, понятен.
P.S. ну и пользоваться этим так:
EXEC dbo.[Какое количество товара я могу купить] 1234.56
DECLARE
@quantity integer,
@price money
SELECT
@quantity = quantity,
@price = price
FROM Goods WITH(NOLOCK)
WHERE
ID=1
только зачем процедура? лучше функция, возвращающая табличное значение.
ну раз надо процедуру - пусть будет процедура
CREATE PROCEDURE dbo.[Какое количество товара я могу купить] (
@Sum money
)
AS
BEGIN
-- объявляем "корзинку" - табличную переменную,
-- в которую будем сгружать отобранные товары
DECLARE @selected_goods TABLE (
ID uniqueidentifier,
quantity integer,
price money
),
-- объявляем всякие вспомогательные переменные
@ID uniqueidentifier,
@quantity integer,
@quantity_to_buy integer,
@price money
-- объявляем курсор, вытаскивающий товары в наличии по убыванию цены
DECLARE goodsCur CURSOR LOCAL STATIC FOR
SELECT
ID,
quantity,
price
FROM
Goods WITH(NOLOCK)
WHERE
quantity > 0
ORDER BY
price DESC
-- открываем курсор
OPEN goodsCur
-- вытаскиваем из курсора очередную запись в локальные переменные
FETCH NEXT FROM goodsCur INTO @ID, @quantity, @price
-- цикл, пока курсор не дошел до конца и пока есть деньги
WHILE @@fetch_status = 0 AND @Sum > 0
BEGIN
-- считаем, сколько товара можно купить
SET @quantity_to_buy = @Sum / @price
IF @quantity_to_buy > @quantity SET @quantity_to_buy = @quantity
-- если товар можно купить, заносим его в корзинку
IF @quantity_to_buy > 0
BEGIN
INSERT INTO @selected_goods (ID, quantity, price)
VALUES (@ID, @quantity_to_buy, @price)
SET @Sum = @Sum - @quantity_to_buy * @price
END
-- вытаскиваем из курсора следующую запись
FETCH NEXT FROM goodsCur INTO @ID, @quantity, @price
END
-- конец цикла
-- закрываем ненужный курсор
CLOSE goodsCur
-- освобождаем ресурсы, занятые ненужным курсором
DEALLOCATE goodsCur
-- отдаем во внешний мир содержимое корзинки
SELECT * FROM @selected_goods
END
примерно так.
в синтаксисе навернякагде-нибудь напутано, но смысл, надеюсь, понятен.
P.S. ну и пользоваться этим так:
EXEC dbo.[Какое количество товара я могу купить] 1234.56
Ринат Смагулов
Как называется путь, которым вы решили задачу через процедуры - путь с помощью курсоров? Путь с помощью селектов так же является приемлемым?
Похожие вопросы
- Microsoft SQL. Процедура вывода максимального количества товаров за определенную сумму
- Приведите примеры удачного использования драйверов БД во фреймворках, более высокоуровневых, чем SQL.
- SQL. Выводятся не все данные. 4 задача.
- Чем отличаются разные SQL?
- Не очень понятен синтаксис запросов SQL
- Помогите написать sql запросы
- Вопрос по SQL + Python
- Что делает кусок коды, выделенный синим? SQL
- Подскажите, есть ли такое понятие чистый SQL???
- Вопрос по SQL. Помогите понять решение задачи