Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с запросом на SQL

Gg Ученик (26), на голосовании 4 месяца назад
Есть задания: Осуществлять продажу изданий магазинам, но еще нужно обеспечить наличие в одном заказе разных изданий в заданном количестве? Ни как не могу понять что значит вторая часть задания. Сейчас у меня есть процедура, в которой я передаю имя магазина название издания кол-во и условия платежа и она добалят в таблицу продажи новый заказ.
 
CREATE PROCEDURE InsertSalesOrder
@stor_name VARCHAR(40),
@title_name VARCHAR(80),
@qty SMALLINT,
@payterms VARCHAR(12)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @stor_id CHAR(4);
DECLARE @title_id CHAR(6);
DECLARE @ord_num VARCHAR(20);
DECLARE @ord_date DATETIME;


SET @ord_date = GETDATE();



SELECT @stor_id = stor_id
FROM stores
WHERE stor_name = @stor_name;


SELECT @title_id = title_id
FROM titles
WHERE title = @title_name;


SET @ord_num = LEFT(CONVERT(VARCHAR(36), NEWID()), 10);



IF @stor_id IS NOT NULL AND @title_id IS NOT NULL
BEGIN

INSERT INTO sales (stor_id, ord_num, ord_date, qty, payterms, title_id)
VALUES (@stor_id, @ord_num, @ord_date, @qty, @payterms, @title_id);


UPDATE titles
SET ytd_sales = ytd_sales + @qty
WHERE title_id = @title_id;


SELECT 'Заказ успшно добавлен' AS [Result];
END
ELSE
BEGIN
IF @stor_id IS NULL
SELECT 'Магазин с указанным названием донт найден' AS [Result];
IF @title_id IS NULL
SELECT 'Издание с указанным названием донт найдено' AS [Result];
END
END
Голосование за лучший ответ
Константин Целищев Профи (513) 5 месяцев назад
Чат джипити так ответил:

Судя по описанию, вторая часть задания подразумевает, что один заказ должен включать несколько разных изданий (т.е. книг, журналов и т.д.) в заданном количестве. Ваша текущая процедура позволяет добавить в таблицу sales только одно издание для одного магазина. Чтобы выполнить требование по добавлению нескольких изданий в один заказ, нужно изменить процедуру таким образом, чтобы она могла принимать несколько изданий и их количества в одном вызове.

Можно изменить процедуру так, чтобы она принимала список изданий и их количества в виде таблицы. Пример модификации процедуры с использованием табличного параметра приведен ниже:

Сначала нужно создать тип данных для табличного параметра:
sql
CREATE TYPE OrderDetailsType AS TABLE
(
title_name VARCHAR(80),
qty SMALLINT
);
Затем изменим процедуру для работы с этим табличным параметром:
sql
CREATE PROCEDURE InsertSalesOrder
@stor_name VARCHAR(40),
@OrderDetails OrderDetailsType READONLY,
@payterms VARCHAR(12)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @stor_id CHAR(4);
DECLARE @ord_num VARCHAR(20);
DECLARE @ord_date DATETIME;

SET @ord_date = GETDATE();

-- Получаем идентификатор магазина
SELECT @stor_id = stor_id
FROM stores
WHERE stor_name = @stor_name;

-- Генерируем номер заказа
SET @ord_num = LEFT(CONVERT(VARCHAR(36), NEWID()), 10);

IF @stor_id IS NOT NULL
BEGIN
-- Перебираем все издания и добавляем их в таблицу продаж
DECLARE @title_id CHAR(6);
DECLARE @title_name VARCHAR(80);
DECLARE @qty SMALLINT;

DECLARE OrderCursor CURSOR FOR
SELECT title_name, qty
FROM @OrderDetails;

OPEN OrderCursor;
FETCH NEXT FROM OrderCursor INTO @title_name, @qty;

WHILE @@FETCH_STATUS = 0
BEGIN
-- Получаем идентификатор издания
SELECT @title_id = title_id
FROM titles
WHERE title = @title_name;

IF @title_id IS NOT NULL
BEGIN
INSERT INTO sales (stor_id, ord_num, ord_date, qty, payterms, title_id)
VALUES (@stor_id, @ord_num, @ord_date, @qty, @payterms, @title_id);

UPDATE titles
SET ytd_sales = ytd_sales + @qty
WHERE title_id = @title_id;
END

FETCH NEXT FROM OrderCursor INTO @title_name, @qty;
END;

CLOSE OrderCursor;
DEALLOCATE OrderCursor;

SELECT 'Заказ успешно добавлен' AS [Result];
END
ELSE
BEGIN
SELECT 'Магазин с указанным названием не найден' AS [Result];
END
END
Теперь вы можете передавать в процедуру список изданий с их количествами. Пример вызова процедуры:

sql

DECLARE @OrderDetails OrderDetailsType;

INSERT INTO @OrderDetails (title_name, qty) VALUES ('Book1', 10);
INSERT INTO @OrderDetails (title_name, qty) VALUES ('Book2', 5);

EXEC InsertSalesOrder @stor_name = 'Store1', @OrderDetails = @OrderDetails, @payterms = 'Net 30';
Этот подход позволяет вам создать один заказ, содержащий несколько разных изданий, и записать их в таблицу sales.
Татьяна Просветленный (36374) 5 месяцев назад
Ваша процедура InsertSalesOrder хорошо обрабатывает добавление одного заказа с одним изданием, но задание требует также возможность обработки заказов с разными изданиями в одном заказе. Чтобы решить эту задачу, вам нужно будет адаптировать процедуру, чтобы она могла принимать несколько изданий и их количество для одного магазина.

1 из способов, как это можно сделать:
  1. Создайте новую процедуру InsertMultipleSalesOrder, которая будет принимать список изданий и их количество.
  2. Используйте таблицу-значение для передачи списка изданий и их количества в процедуру.
  3. Внутри процедуры обработайте каждую запись из таблицы-значения и добавьте соответствующие записи в таблицу продаж.
 CREATE TYPE TitleQuantityTableType AS TABLE  
(
title_name VARCHAR(80),
qty SMALLINT
);
GO

CREATE PROCEDURE InsertMultipleSalesOrder
@stor_name VARCHAR(40),
@TitleQuantity TitleQuantityTableType READONLY,
@payterms VARCHAR(12)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @stor_id CHAR(4);
DECLARE @ord_num VARCHAR(20);
DECLARE @ord_date DATETIME;

SET @ord_date = GETDATE();

SELECT @stor_id = stor_id
FROM stores
WHERE stor_name = @stor_name;

SET @ord_num = LEFT(CONVERT(VARCHAR(36), NEWID()), 10);

IF @stor_id IS NOT NULL
BEGIN
DECLARE @title_id CHAR(6);

DECLARE TitleCursor CURSOR FOR
SELECT title_name, qty FROM @TitleQuantity;

OPEN TitleCursor;

FETCH NEXT FROM TitleCursor INTO @title_name, @qty;

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @title_id = title_id
FROM titles
WHERE title = @title_name;

IF @title_id IS NOT NULL
BEGIN
INSERT INTO sales (stor_id, ord_num, ord_date, qty, payterms, title_id)
VALUES (@stor_id, @ord_num, @ord_date, @qty, @payterms, @title_id);

UPDATE titles
SET ytd_sales = ytd_sales + @qty
WHERE title_id = @title_id;
END
ELSE
BEGIN
SELECT 'Издание с названием ' + @title_name + ' не найдено' AS [Result];
END

FETCH NEXT FROM TitleCursor INTO @title_name, @qty;
END

CLOSE TitleCursor;
DEALLOCATE TitleCursor;

SELECT 'Заказ успешно добавлен' AS [Result];
END
ELSE
BEGIN
SELECT 'Магазин с указанным названием не найден' AS [Result];
END
END
GO
Похожие вопросы