Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 23250|Отговор: 11

[Нов брой] Как да изберете най-евтините стаи

[Копирай линк]
Публикувано в 5.12.2018 г. 21:32:38 ч. | | | |
Сега има две маси за използване – room_type и room_info
Има 3 хотела с ID 1~3. След това всеки хотел има 3 типа стаи, с ID 1~9 съответно.
room_type съдържа името, 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 г. Спринт материали на Сю Тао и Сяо Сюронг
Публикувано в 6.12.2018 г. 17:00:58 ч. |
Тази публикация беше последно редактирана от 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
КРАЙ

Резултат

Брой участници1MB+1 допринасям+1 Срив причина
Администратор + 1 + 1 Ентусиазиран съм да помагам на другите!

Вижте всички оценки

 Хазяин| Публикувано в 6.12.2018 г. 14:11:48 ч. |
xzxmustwin Публикувано на 2018-12-6 11:58
Честно казано, структурата на тази таблица е малко неразумна

Домашните, зададени от учителя по emmmm базата данни, може наистина да са неразумни, и не бих ги забелязал, ако не ги научих много добре...
Въпреки това, ключът остават идеите за решаване на проблеми, искам да попитам приятелите си дали имате някакви предложения?
 Хазяин| Публикувано в 6.12.2018 г. 14:09:20 ч. |
LZZSF публикува на 2018-12-6 09:07
MySQL е остарял, няма клиент, дай ми скрипта за SQL Server

Съжалявам, все още не съм използвал SQL Sever, може би защото е само обучение, затова учителят ни помоли да използваме mysql, за да го направим. Ако приятелите ви са готови да споделят идеите си, благодаря ви много.
Публикувано в 5.12.2018 г. 21:57:13 ч. |
Ще отида в QQ групата, за да ти предложа награда от 10 юана, за да видя дали някой може да ти помогне да отговориш "не"
Публикувано в 6.12.2018 г. 7:56:39 ч. |
Помощ
Публикувано в 6.12.2018 г. 9:07:08 ч. |
MySQL е остарял, няма клиент, дай ми скрипта за SQL Server

Резултат

Брой участници1MB+1 допринасям+1 Срив причина
Администратор + 1 + 1 Ентусиазиран!

Вижте всички оценки

Публикувано в 6.12.2018 г. 11:24:25 ч. |
LZZSF публикува на 2018-12-6 09:07
MySQL е остарял, няма клиент, дай ми скрипта за SQL Server

Препоръчително е да се говори за идеята и да се остави хазяинът да я използва като препоръка, което също би трябвало да е възможно
Публикувано в 6.12.2018 г. 11:58:37 ч. |
Честно казано, структурата на тази таблица е малко неразумна

Резултат

Брой участници1MB+1 допринасям+1 Срив причина
Администратор + 1 + 1 Ентусиазиран!

Вижте всички оценки

 Хазяин| Публикувано в 6.12.2018 г. 14:07:29 ч. |
Публикувано на 2018-12-5 21:57
Ще отида в QQ групата, за да ти предложа награда от 10 юана, за да видя дали някой може да ти помогне да отговориш "не"

Благодаря, ако някой е готов да отговори, ще ви изпратя червения плик :)
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com