Тази публикация беше последно редактирана от Miaolinsen на 2018-12-6 17:03
Не го направих с mysql, а с mssql:
/* Посочете времевия диапазон и броя на стаите за резервация, направете запитване към хотелите, избора на тип стаи и средните цени, които отговарят на условията (време, брой оставащи стаи), и ги сортирайте по средна цена от най-ниска към най-висока. Резултатите включват хотели, избрани комбинации от стаи и количества, както и най-ниска средна цена. ##不要求为同一房型, но трябва да е същият хотел и можеш да смениш типа стая по средата. -- Парсинг: Означава, че няма нужда да се разглежда типът на стаята, а само броят на стаите ##比如, изберете час за настаняване 2018-11-14~2018-11-15, и броят на резервираните стаи е 5 -- Анализ: Хотелът трябва да е в диапазона за дата, и има търсене на броя стаи всеки ден (ако няма стаи в определен ден, няма да отговаря на стандарта) ##返回选择酒店A, 11-14 изберете 4 типа стаи с ID 3, 1 тип стаи с ID 2, 11-15 изберете 3 типа стаи с ID 3, 2 типа стаи с ID 2, а най-ниската цена е 2000 -- Анализ: Изчислете средната цена според минималната конфигурация на ден ##老师要求只能用sql语句, mySQL имплементация, не може да използва python, c++ и т.н. */
-- Входящи параметри, диапазон на дата, брой необходими стаи ОБЯВИ @sdate ДАТА = '2018-11-14'; ОБЯВИ @edate ДАТА = '2018-11-15'; ОБЯВИ @roomnum INT = 5;
-- Изчислете броя дни на престой ОБЯВИ @days INT; SET @days = DATEDIFF(DAY, @sdate, @edate)+1;
-- Номер на хотел, който отговаря на датовите диапазони, брой стаи IF EXISTS(select * от tempdb.dbo.sysobjects, където id = object_id(N'tempdb.. ##temp_hotel') и type='U') ЗАПОЧНЕТЕ Drop таблица ##temp_hotel КРАЙ
ИЗБЕРЕТЕ ta.hotel_id в ##temp_hotel ОТ (SELECT ri. [date], rt.hotel_id, SUM(ri.remain) room_num ОТ room_info ri LEFT JOIN room_type rt на ri.room_id=rt.room_id където @sdate <= [дата] и [дата] <= @edate ГРУПА BY ri. [дата],rt.hotel_id ИМА SUM(remain) >= 5) ta ГРУПА ПО ta.hotel_id ИМА БРОЙ(*) = @days
-- Изчислява се според хотела (конфигуриране на минималния тип стая на ден)
IF EXISTS(select * от tempdb.dbo.sysobjects, където id = object_id(N'tempdb.. ##temp_result') и type='U') ЗАПОЧНЕТЕ Таблица за спускане ##temp_result КРАЙ -- Предварителна таблица с резултати Дата на хотел Тип стая Идентификация Тип стая Име Брой стаи Цена на стаите Дневна сума на хотела Дневна средна цена на хотела Обща цена на хотела Хотел Обща дневна средна цена на хотела Обща дневна цена на стаите СЪЗДАЙ ТАБЛИЦА ##temp_result( hotel_id ИНТЕЛИГЕНТ, hotel_name Вархар (255), [дата] ДАТА, room_id ИНТЕЛИГЕНТ, room_name ВАРХАР (255), room_num ИНТЕЛИГЕНТ, ДЕСЕТИЧНА ЦЕНА НА СТАЯТА, dsumprice DECIMAL, davgprice DECIMAL, sumpric DECIMAL, sumavgpric DECIMAL
)
ОБЯВИ @hid INT; -- Хотелска карта ОБЯВИ @infoid INT; -- info id --потвърди, че курсорът е колекция DECLARE my_cursor курсора за (SELECT hotel_id от ##temp_hotel); --Отвори курсора-- Отворен my_cursor --Променливи на курсора на стартовия цикъл-- Донеси следващото от my_cursor в @hid докато @@FETCH_STATUS = 0 -- връща състоянието на последния курсор, изпълнен от FETCH оператора -- ЗАПОЧНЕТЕ -- Според хотелския идентификатор, датата на повтарящи се е ценова IF EXISTS(select * от tempdb.dbo.sysobjects, където id = object_id(N'tempdb.. ##temp_room') и type='U') ЗАПОЧНЕТЕ Drop таблица ##temp_room КРАЙ
-- Хотели, по дата, с стаи, сортирани по дата Тарифа ИЗБЕРЕТЕ info_id, [дата], цена, остани, room_id В ##temp_room ОТ dbo.room_info, КЪДЕТО @sdate <= [дата] и [дата] <= @edate И ОСТАВАТ > 0 И room_id В (ИЗБЕРЕТЕ rt.room_id ОТ dbo.room_type rt КЪДЕТО rt.hotel_id=@hid) ПОРЪЧКА ПО [дата] ASC, цена ASC
DECLARE @thisrdate DATE = NULL; -- Среща ОБЯВИ @thisrnum INT=0; -- Брой стаи, избрани на текущата дата
ДЕКЛАРИРАЙ @rdate ДАТА = NULL; -- Среща ОБЯВИ @rmnum INT = 0; -- Брой стаи по тип стаи
-- Цикъл по дата ОБЯВЕТЕ @my_cursor2 КУРСОР; set @my_cursor2 = КУРСОР ЗА SELECT info_id ОТ ##temp_room ORDER BY [DATE] ASC, цена ASC ОТВОРЕН @my_cursor2; ДОНЕСИ СЛЕДВАЩОТО ОТ @my_cursor2 В @infoid WHILE(@@FETCH_STATUS=0) ЗАПОЧНЕТЕ --##temp_result ИЗБЕРЕТЕ @rmnum=remain, @rdate=[дата] ОТ ##temp_room КЪДЕТО info_id=@infoid АКО (@thisrdate Е НУЛЕВО ИЛИ @thisrdate != @rdate) ЗАПОЧНЕТЕ ПЕЧАТ @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; КРАЙ -- Тип стая за избор на дозови формуляри IF(@thisrnum <= @roomnum) ЗАПОЧНЕТЕ АКО (@thisrnum + @rmnum > @roomnum) ЗАПОЧНЕТЕ -- Броят стаи, които трябва да използваш SET @rmnum = @roomnum-@thisrnum; КРАЙ КРАЙ ИНАЧЕ ЗАПОЧНЕТЕ -- За тази дата не е необходима стая SET @rmnum = 0; КРАЙ
АКО (@rmnum > 0) ЗАПОЧНЕТЕ -- Добавяне на резултати по зададен брой ВМЪКНЕТЕ В ##temp_result(hotel_id, hotel_name, [дата], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) ИЗБЕРЕТЕ @hid, '', @thisrdate, room_id, '', @rmnum, цена, 0, 0, 0 ОТ ##temp_room КЪДЕТО info_id = @infoid
-- Броят на стаите е достигнал изчислената средна цена SET @thisrnum = @thisrnum + @rmnum; АКО (@thisrnum = @roomnum) ЗАПОЧНЕТЕ -- Обща цена по хотели, изчислена за дати АКТУАЛИЗАЦИЯ ##temp_result SET dsumprice=(SELECT SUM(room_num*roomprice) ОТ ##temp_result tr, КЪДЕТО tr.hotel_id=@hid И TR.[ DATE]=@thisrdate) КЪДЕТО hotel_id=@hid И [дата]=@thisrdate -- Изчислете средната цена на стаите по хотел, общата цена по дата АКТУАЛИЗАЦИЯ ##temp_result SET davgprice=(dsumprice/@roomnum) КЪДЕТО hotel_id=@hid И [date]=@thisrdate КРАЙ КРАЙ
ДОНЕСИ СЛЕДВАЩОТО ОТ @my_cursor2 В @infoid; КРАЙ близо @my_cursor2; --Изключи курсора deallocate @my_cursor2; --освобождаване на курсора
-- По хотел, изчислете общата цена на хотела АКТУАЛИЗАЦИЯ ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) ОТ ##temp_result tr КЪДЕТО tr.hotel_id=@hid) КЪДЕТО hotel_id=@hid -- Изчислете средната дневна цена на общата стая в хотела АКТУАЛИЗАЦИЯ ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) КЪДЕТО hotel_id=@hid
FETCH следва от my_cursor в @hid - отиди на следващия курсор, без deadloops КРАЙ Затвори my_cursor -- затвори курсора deallocate my_cursor - Освободи курсора
-- Добавете името на хотела и типа стая към временната маса АКТУАЛИЗАЦИЯ ##temp_result SET hotel_name=(SELECT ht.hotel_name FROM dbo.hotel ht, КЪДЕТО ht.hotel_id=##temp_result.hotel_id), room_name=(ИЗБЕРЕТЕ rt.room_name ОТ dbo.room_type RT, КЪДЕТО rt.room_id=##temp_result.room_id)
-- Проверете резултатите от таблицата с резултати ИЗБЕРЕТЕ * От ##temp_result
-- Край на изчистването на временни маси IF EXISTS(select * от tempdb.dbo.sysobjects, където id = object_id(N'tempdb.. ##temp_hotel') и type='U') ЗАПОЧНЕТЕ Drop таблица ##temp_hotel КРАЙ IF EXISTS(select * от tempdb.dbo.sysobjects, където id = object_id(N'tempdb.. ##temp_room') и type='U') ЗАПОЧНЕТЕ Drop таблица ##temp_room КРАЙ IF EXISTS(select * от tempdb.dbo.sysobjects, където id = object_id(N'tempdb.. ##temp_result') и type='U') ЗАПОЧНЕТЕ Таблица за спускане ##temp_result КРАЙ
|