Останній раз цей допис редагував Miaolinsen 6.12.2018, 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(виберіть * з tempdb.dbo.sysobjects, де id = object_id(N'tempdb.. ##temp_hotel') та type='U') ПОЧАТОК Стіл для скидання ##temp_hotel КІНЕЦЬ
ВИБЕРІТЬ ta.hotel_id у ##temp_hotel З (ВИБЕРИ рі. [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 GROUP BY ri. [дата],rt.hotel_id МАЄ SUM(remain) >= 5) ta ГРУПА ЗА ta.hotel_id МАЄ COUNT(*) = @days
-- Розраховується відповідно до готелю (налаштуйте мінімальний тип кімнати на день)
IF EXISTS(виберіть * з tempdb.dbo.sysobjects, де id = object_id(N'tempdb.. ##temp_result') та type='U') ПОЧАТОК Drop Table ##temp_result КІНЕЦЬ -- Попередня таблиця результатів Дата готелю Тип номера Ідентифікація Тип номера Назва Кількість номерів Ціна номера Добна сума готелю Денна середня ціна готелю Загальна ціна готелю Загальна ціна готелю Загальна середня ціна готелю Загальна добова ціна номера СТВОРИТИ ТАБЛИЦЮ ##temp_result( hotel_id ІНТЕЛЕКТ, hotel_name вархар (255), [дата] ДАТА, room_id ІНТЕЛЕКТ, room_name ВАРШАР (255), room_num ІНТЕЛЕКТ, ДЕСЯТКОВА ЦІНА кімнати, dsumprice ДЕСЯТКОВИЙ, davgprice DECIMAL, sumpric DECIMAL, sumavgpric ДЕСЯТКОВА
)
ОГОЛОСИТИ @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(виберіть * з tempdb.dbo.sysobjects, де id = object_id(N'tempdb.. ##temp_room') та type='U') ПОЧАТОК Drop Table ##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
ОГОЛОСИТИ @thisrdate DATE = NULL; -- Побачення ОГОЛОСИТИ @thisrnum INT=0; -- Кількість кімнат, обраних на поточну дату
ОГОЛОСИТИ @rdate ДАТУ = NULL; -- Побачення ОГОЛОСИТИ @rmnum INT = 0; -- Кількість кімнат за типом кімнат
-- Цикл за датою ОГОЛОСИТИ @my_cursor2 КУРСОР; встановити @my_cursor2 = КУРСОР ДЛЯ SELECT info_id З ##temp_room ORDER BY [Date] ASC, ціна ASC ВІДКРИТИЙ @my_cursor2; ПРИНЕСІТЬ ДАЛІ З @my_cursor2 У @infoid WHILE(@@FETCH_STATUS=0) ПОЧАТОК --##temp_result ВИБЕРІТЬ @rmnum=залишитися, @rdate=[дата] З ##temp_room ДЕ info_id=@infoid ЯКЩО (@thisrdate Є NULL АБО @thisrdate != @rdate) ПОЧАТОК ДРУК @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; КІНЕЦЬ -- Тип кімнати для вибору дозової форми IF(@thisrnum <= @roomnum) ПОЧАТОК IF (@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, price, 0, 0, 0, 0 З ##temp_room ДЕ info_id = @infoid
-- Кількість кімнат досягла розрахункової середньої ціни SET @thisrnum = @thisrnum + @rmnum; ЯКЩО (@thisrnum = @roomnum) ПОЧАТОК -- Загальна ціна за готелями, розрахована за датами ОНОВЛЕННЯ ##temp_result ВСТАНОВИТИ dsumprice=(ВИБРАТИ SUM(room_num*roomprice) З ##temp_result tr, ДЕ tr.hotel_id=@hid І TR.[ DATE]=@thisrdate) ДЕ hotel_id=@hid А [дата]=@thisrdate -- Розрахуйте середню ціну номера за готелями, загальну ціну за датою ОНОВЛЕННЯ ##temp_result ВСТАНОВИТИ davgprice=(dsumprice/@roomnum), ДЕ hotel_id=@hid Та [дата]=@thisrdate КІНЕЦЬ КІНЕЦЬ
ПРИНЕСІТЬ ДАЛІ З @my_cursor2 У @infoid; КІНЕЦЬ близько @my_cursor2; --Вимкни курсор deallocate @my_cursor2; --випуск курсора
-- За готелями, розрахуйте загальну ціну готелю ОНОВЛЕННЯ ##temp_result ВСТАНОВИТИ SUMPRIC=(ВИБРАТИ СУМУ(room_num*вартість кімнати) З ##temp_result TR, ДЕ tr.hotel_id=@hid) ДЕ hotel_id=@hid -- Розрахуйте середню добову ціну загальної кількості номерів у готелі ОНОВЛЕННЯ ##temp_result ВСТАНОВИТИ sumavgpric=(sumpric/@roomnum/@days) ДЕ hotel_id=@hid
FETCH далі з my_cursor у @hid — переходьте до наступного курсора, без мертвих петель КІНЕЦЬ Закрити my_cursor -- закрити курсор Deallocate my_cursor - Відпусти курсор
-- Додайте назву готелю та тип кімнати до тимчасового столу ОНОВЛЕННЯ ##temp_result SET hotel_name=(ВИБЕРІТЬ ht.hotel_name З 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(виберіть * з tempdb.dbo.sysobjects, де id = object_id(N'tempdb.. ##temp_hotel') та type='U') ПОЧАТОК Стіл для скидання ##temp_hotel КІНЕЦЬ IF EXISTS(виберіть * з tempdb.dbo.sysobjects, де id = object_id(N'tempdb.. ##temp_room') та type='U') ПОЧАТОК Drop Table ##temp_room КІНЕЦЬ IF EXISTS(виберіть * з tempdb.dbo.sysobjects, де id = object_id(N'tempdb.. ##temp_result') та type='U') ПОЧАТОК Drop Table ##temp_result КІНЕЦЬ
|