Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 23250|Відповідь: 11

[Новий випуск] Як обрати найдешевші номери

[Копіювати посилання]
Опубліковано 05.12.2018 21:32:38 | | | |
Тепер є дві таблиці: room_type і room_info
Є 3 готелі з ID 1~3. Кожен готель має 3 типи номерів з ідентифікаторами 1~9 відповідно.
room_type містить назву, ID та відповідний готельний ID кожного типу кімнати
У room_info зберігається ціна кожного дня, кожен тип кімнати та кількість кімнат, що залишилися.
Теми, які я хотів би поставити:
Вкажіть часовий діапазон і кількість номерів для бронювання, запитуйте готелі, вибір типів кімнат і середні ціни, що відповідають умовам (час, кількість номерів, що залишилися), і відсортуйте їх за середньою ціною від найнижчої до найвищої. Результати включають готелі, вибрані комбінації номерів і кількість номерів, а також найнижчу середню ціну.
##不要求为同一房型, але це має бути той самий готель, і ти можеш змінити тип номера посередині.
##比如, час реєстрації — 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++ тощо
Я не писав це цілий день і не бачив подібної теми в Інтернеті, тож прийшов попросити богів про допомогу і запитати, як її досягти, дякую~







Попередній:Самозвіт про обмін досвідом програми PHP ape
Наступний:Політика вступних іспитів 2019 року Сюй Тао та матеріали спринту Сяо Сюжун
Опубліковано 06.12.2018 17:00:58 |
Останній раз цей допис редагував 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
КІНЕЦЬ

Забити

Кількість учасників1МБ+1 Сприяють+1 Колапс причина
Адміністратора + 1 + 1 З ентузіазмом допомагаю іншим!

Переглянути всі рейтинги

 Орендодавець| Опубліковано 06.12.2018 14:11:48 |
xzxmustwin Опубліковано 2018-12-6 11:58
Чесно кажучи, структура цієї таблиці трохи надто розумна

Домашні завдання, які дає вчитель з бази даних еммм, можуть бути справді нерозумними, і я не бачив їх, якби не вивчив їх дуже добре...
Однак головне — це ідеї для розв'язання проблем, я хочу запитати у друзів, чи є у вас якісь поради?
 Орендодавець| Опубліковано 06.12.2018 14:09:20 |
LZZSF опубліковано 2018-12-6 09:07
MySQL застарілий, немає клієнта, дайте мені скрипт для SQL Server

Вибачте, я ще не користувався SQL Sever, можливо, тому що це просто навчання, тому вчитель попросив нас використовувати mysql. Якщо ваші друзі готові поділитися своїми ідеями, дуже дякую.
Опубліковано 05.12.2018 21:57:13 |
Я піду до групи QQ, щоб запропонувати винагороду в 10 юанів і подивитися, чи хтось допоможе відповісти «ні»
Опубліковано 06.12.2018 07:56:39 |
Допомога
Опубліковано 06.12.2018 09:07:08 |
MySQL застарілий, немає клієнта, дайте мені скрипт для SQL Server

Забити

Кількість учасників1МБ+1 Сприяють+1 Колапс причина
Адміністратора + 1 + 1 З ентузіазмом!

Переглянути всі рейтинги

Опубліковано 06.12.2018 11:24:25 |
LZZSF опубліковано 2018-12-6 09:07
MySQL застарілий, немає клієнта, дайте мені скрипт для SQL Server

Рекомендується обговорити цю ідею і дати орендодавцю використати її як рекомендацію, що також має бути можливим
Опубліковано 06.12.2018 11:58:37 |
Чесно кажучи, структура цієї таблиці трохи надто розумна

Забити

Кількість учасників1МБ+1 Сприяють+1 Колапс причина
Адміністратора + 1 + 1 З ентузіазмом!

Переглянути всі рейтинги

 Орендодавець| Опубліковано 06.12.2018 14:07:29 |
Опубліковано 2018-12-5 21:57
Я піду до групи QQ, щоб запропонувати винагороду в 10 юанів і подивитися, чи хтось допоможе відповісти «ні»

Дякую, якщо хтось готовий відповісти, я надішлю вам червоний конверт :)
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com