Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Написание функции  [new]
bentOS
Member

Откуда: Санкт-Петербург
Сообщений: 4
Добрый день.

Проблема такая: есть БД отеля, имеем 3 таблицы(Номер, Постояльцы, Процент), в таблице Процент содержится значение наценки на класс номера(обычный - 0%, первый - 5%, полулюкс - 10%, люкс - 20%).

Собственно, сабж. Необходимо реализовать функцию, которая производит расчет номера в зависимости от класса номера.

Как я себе это представляю:

CREATE FUNCTION procent(@nomer char(10), @class char(10)) RETURNS TABLE
AS
BEGIN
	 DECLARE 
         @price int
         @i int;
         @i = 1;
         Цикл(пока есть номера, выполнять)
               @price = Номер.Стоимость;
               @class = Номер.Класс;
               IF @class  = "Первый" THEN
                  Номер.Стоимость = (@price+(@price*Процент.Наценка)
               ELSE IF @class  = "Полулюкс" THEN
                  Номер.Стоимость = (@price+(@price*Процент.Наценка)
               ELSE IF @class  = "Люкс" THEN
                  Номер.Стоимость = (@price+(@price*Процент.Наценка)
         Конец цикла
END;


Как реализовать - не понимаю, поэтому прошу помощи. Заранее спасибо.
25 июн 14, 22:00    [16220129]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
select... case when then when then... else ..end
25 июн 14, 22:15    [16220214]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
bentOS
Member

Откуда: Санкт-Петербург
Сообщений: 4
Winnipuh,

Так?

CREATE FUNCTION procent
AS
BEGIN
	 SELECT * FROM Номер.Класс;
         CASE
              WHEN Номер.Класс = "Первый" THEN Номер.Стоимость = Номер.Стоимость + (Номер.Стоимость / 100 * Процент.Наценка)
              WHEN Номер.Класс = "Полулюкс" THEN Номер.Стоимость = Номер.Стоимость + (Номер.Стоимость / 100 * Процент.Наценка)
              WHEN Номер.Класс = "Люкс" THEN Номер.Стоимость = Номер.Стоимость + (Номер.Стоимость / 100 * Процент.Наценка)
         END;
END;
25 июн 14, 22:30    [16220291]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
bentOS,

нет, не так. Что бы сервер мог что-то подсчитать необходима таблица -справочник. Создайте справочник, который содержит типы номеров и процентовку, затем запросом объедините конкретный номер из списка номеров со справочником по типу номера.
Базовая цена тоже должна находиться в каком-то справочнике цен, например, сезонном. Тогда вы кполученному объединения таблиц присоедините справочник базовой цены в зависимости от сезона. В итоге - произведение полей двух столбцов - базовая цена и процент.
25 июн 14, 22:54    [16220398]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
bentOS
Member

Откуда: Санкт-Петербург
Сообщений: 4
Владислав Колосов,

Структура базы такая:

dbo.Номер
ID Номер Класс Стоимость
1100 Обычный 500
3101 Обычный 500
4102 Первый 500
5100 Полулюкс 500
6100 Люкс 500


dbo.Постояльцы
ID ФИО Прибытие Убытие
2Петров П.П.2014-06-12 2014-06-25
3 Иванов И.И. 2014-06-15 2014-06-16
4 Сидоров С.С. 2014-06-19 2014-06-29


dbo.Процент
ID Класс Наценка
1 Обычный 0
2 Первый 5
4 Полулюкс 10
5 Люкс 20
25 июн 14, 23:07    [16220438]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
bentOS
Winnipuh,

Так?
Вы бы прочитали синтаксис CASE, там и примеры есть.

Ещё для решения задачи нужно будет узнать про синтаксис SELECT, обращая особое внимание на JOIN
25 июн 14, 23:20    [16220486]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
bentOS
Member

Откуда: Санкт-Петербург
Сообщений: 4
alexeyvg,

CREATE OR REPLACE FUNCTION procent(@nacenka int) RETURNS int
AS
BEGIN
	 SELECT DISTINCT Номер.Класс
		CASE
			WHEN Класс IS 'Первый' THEN Номер.Стоимость = (Номер.Стоимость + (Номер.Стоимость/100*Процент.Наценка)
			WHEN Класс IS 'Полулюкс' THEN Номер.Стоимость = (Номер.Стоимость + (Номер.Стоимость/100*Процент.Наценка)
			WHEN Класс IS 'Люкс' THEN Номер.Стоимость = (Номер.Стоимость + (Номер.Стоимость/100*Процент.Наценка)
		END;
	 FROM Номер JOIN
		Процент ON Номер.Класс = Процент.Класс
END


Сообщение 156, уровень 15, состояние 1, строка 1
Неправильный синтаксис около ключевого слова "OR".
Сообщение 156, уровень 15, состояние 1, строка 5
Неправильный синтаксис около ключевого слова "CASE".
26 июн 14, 00:44    [16220684]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Зачем придумывать свой синтаксис, непонимаю
CREATE FUNCTION procent(@nacenka int) RETURNS int
AS

BEGIN
declare @ret int
	 SELECT top 1 @ret = 
		CASE Номер.Класс
			WHEN 'Первый'     THEN (Номер.Стоимость + (Номер.Стоимость / 100 * Процент.Наценка))
			WHEN 'Полулюкс' THEN (Номер.Стоимость + (Номер.Стоимость / 100 * Процент.Наценка))
			WHEN 'Люкс'       THEN (Номер.Стоимость + (Номер.Стоимость / 100 * Процент.Наценка))
		END
	 FROM Номер JOIN
		Процент ON Номер.Класс = Процент.Класс
            where 
                   Процент.Наценка = @nacenka
return @ret
END
26 июн 14, 08:28    [16220967]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
CREATE FUNCTION dbo.стоимость_номера(@номер CHAR(10)) RETURNS INT
AS
BEGIN
	DECLARE @стоимость INT

	SELECT @стоимость = ROUND(n.Стоимость * (1 + p.Процент / 100.), 0)
	FROM   dbo.Номер n
	       INNER JOIN dbo.Процент p
	            ON  p.Класс = n.Класс
	WHERE  n.Номер = @номер 
	
	RETURN @стоимость
END
GO
CREATE FUNCTION dbo.стоимость_номеров() RETURNS TABLE
AS
RETURN
	SELECT n.ID,
	       n.Номер,
	       n.Класс,
	       n.Стоимость,
	       p.Процент,
	       Cтоимость_с_процентом = CONVERT(INT, ROUND(n.Стоимость * (1 + p.Процент / 100.), 0))
	FROM   dbo.Номер n
	       INNER JOIN dbo.Процент p
	            ON  p.Класс = n.Класс
GO
-- если в таблицу Постоялец добавить столбец Номер, то ...
CREATE FUNCTION dbo.расчёт_номера(@ФИО CHAR(10), @убытие date) RETURNS INT
AS
BEGIN
	DECLARE @расчёт INT

	SELECT @расчёт = ROUND(n.Стоимость * (1 + p.Процент / 100.), 0) * CASE WHEN c.Прибытие = c.Убытие THEN 1 ELSE DATEDIFF(DAY, c.Прибытие, c.Убытие) END
	FROM              dbo.Постоялец с
	       INNER JOIN dbo.Номер     n ON  n.Номер = c.Номер
	       INNER JOIN dbo.Процент   p	ON  p.Класс = n.Класс
	WHERE
	       c.ФИО = @ФИО AND c.Убытие = @убытие
	
	RETURN @расчёт
END
GO
26 июн 14, 09:09    [16221065]     Ответить | Цитировать Сообщить модератору
 Re: Написание функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
bentOS, чуток подправьте структуру, надеюсь, идея понятна:

IDНомерКласс ИДСтоимость
11001500
31011500
41022500
51034500
62015500


dbo.Пребывание
ID_PKКлиент ИДНомер ИДПрибытиеУбытиеКомментарий
1212014-06-122014-06-25
2322014-06-152014-06-16
3422014-06-192014-06-29
4212014-07-012014-07-12забыл тапки
5262014-08-012014-08-12
6422014-09-102014-10-05


dbo.Постояльцы
IDФИОПаспортВыдан
2Петров П.П.4004123456ОВД Нского города
3Иванов И.И.6004032023ОВД Кского города
4Сидоров С.С.7004561245ОВД Мского города


dbo.Процент
IDКлассНаценка
1Обычный 1
2Первый1.05
4Полулюкс1.1
5Люкс1.2
6Сотрудник0.8


Добавьте историю изменения цен и класса для номеров, будет полезно.
26 июн 14, 12:52    [16222636]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить