Ten post został ostatnio edytowany przez Miaolinsen 6.12.2018 o 17:03
Nie zrobiłem tego z mysql, zrobiłem to z mssql:
/* Określ przedział czasowy i liczbę pokoi do rezerwacji, zapytaj hotele, typy pokoi i ich średnie ceny spełniające warunki (czas, liczba pozostałych pokoi) i sortuj je według średniej ceny od najniższej do najwyższej. Wyniki to hotele, wybrane kombinacje i ilości pokoi oraz najniższa średnia cena. ##不要求为同一房型, ale to musi być ten sam hotel i możesz zmienić typ pokoju w trakcie drogi. -- Parsowanie: Oznacza to, że nie ma potrzeby rozważania typu pokoju, tylko liczba pokoi ##比如, wybierz godzinę zameldowania 2018-11-14~2018-11-15, a liczba zarezerwowanych pokoi wynosi 5 -- Analiza: Hotel musi mieścić się w przedziale dat, a zapotrzebowanie na liczbę pokoi jest codziennie (jeśli w danym dniu nikogo nie ma, nie spełni standardu) ##返回选择酒店A, 11-14 wybierz 4 typy pokoi z ID 3, 1 typ pokoju z ID 2, 11-15 wybierz 3 typy pokoi z ID 3, 2 typy pokoi z ID 2, a najniższa cena to 2000 -- Analiza: Oblicz średnią cenę według minimalnej konfiguracji na dzień ##老师要求只能用sql语句, implementacja mysql, nie może używać pythona, c++ itd. */
-- Parametry wejściowe, zakres dat, liczba wymaganych pomieszczeń DEKLARUJ @sdate DATA = '2018-11-14'; DEKLARUJ @edate DATA = '2018-11-15'; DEKLARUJ @roomnum INT = 5;
-- Oblicz liczbę dni pobytu DEKLARUJ @days INT; USTAW @days = DATEDIFF(DZIEŃ, @sdate, @edate)+1;
-- Numer hotelu spełniający zakres dat, liczba pokoi JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_hotel') i type='U') POCZĄTEK Drop table ##temp_hotel KONIEC
WYBIERZ ta.hotel_id do ##temp_hotel Z (WYBIERZ ri. [date], rt.hotel_id, SUM(ri.remain) room_num OD room_info ri LEFT JOIN JOIN room_type rt na ri.room_id=rt.room_id gdzie @sdate <= [data] i [date] <= @edate GRUPA BY ri. [data],rt.hotel_id POSIADAJĄCEJ SUM(pozostałość) >= 5) ta GRUPA PRZEZ ta.hotel_id LICZENIE(*) = @days
-- Obliczane według hotelu (konfiguruj minimalny typ pokoju na dzień)
JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_result') i type='U') POCZĄTEK Drop table ##temp_result KONIEC -- Wstępna tabela wyników Hotelowy Pokój randkowy Typ ID Typ pokoju Nazwa Liczba pokoi Cena pokoju Hotel Dzienna Całkowita Cena hotelu Średnia cena hotelu Całkowita Cena hotelu Całkowita Średnia dzienna cena hotelu Łączna dzienna cena pokoju UTWÓRZ TABELĘ ##temp_result( hotel_id INT, hotel_name varchar(255), [randka] DATE, room_id INT, room_name VARCHAR(255), room_num INT, roomprice DECIMAL, dsumprice DZIESIĘTNY, DAGPRICE DZIESIĘTNY, podsumowanie DZIESIĘTNE, sumavgpric DZIESIĘTNY
)
DEKLARUJ @hid INT; -- Identyfikator hotelu DEKLARUJ @infoid INT; -- ID informacji --potwierdzaj, że kursor jest zbiorem ZADEKLARUJ my_cursor kursora dla (WYBIERZ hotel_id z ##temp_hotel); --Otwórz kursor-- otwórz my_cursor --Zmienne kursora pętli startowej-- Aportuj następnego z my_cursor do @hid podczas gdy @@FETCH_STATUS = 0 -- zwraca stan ostatniego kursora wykonanego przez polecenie FETCH -- POCZĄTEK -- Na podstawie identyfikatora hotelu, data powtarzająca się jest ustalana w cenie JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_room') i type='U') POCZĄTEK Drop table ##temp_room KONIEC
-- Hotele, według daty, z pokojami posortowanymi według daty Cenka WYBIERZ info_id, [data], cena, pozostań, room_id DO ##temp_room Z dbo.room_info GDZIE @sdate <= [data] i [data] <= @edate I POZOSTAŃ > 0 I room_id W (WYBIERZ rt.room_id Z dbo.room_type rt, GDZIE rt.hotel_id=@hid) KOLEJNOŚĆ WEDŁUG [data] ASC, cena ASC
DECLARE @thisrdate DATE = NULL; -- Data ZADEKLARUJ @thisrnum INT=0; -- Liczba wybranych pokoi w obecnym dniu
DECLARE @rdate DATE = NULL; -- Data ZADEKLARUJ @rmnum INT = 0; -- Liczba pokoi według typu pokoju
-- Cykl według daty DEKLARUJ @my_cursor2 KURSOR; ustaw @my_cursor2 = KURSOR DLA SELECT info_id Z ##temp_room KOLEJNOŚĆ PRZEZ [data] ASC, cena ASC OTWARTE @my_cursor2; PRZYNIEŚ NASTĘPNE Z @my_cursor2 DO @infoid WHILE(@@FETCH_STATUS=0) POCZĄTEK --##temp_result SELECT @rmnum=remain, @rdate=[data] OD ##temp_room GDZIE info_id=@infoid JEŚLI (@thisrdate JEST NULL LUB @thisrdate != @rdate) POCZĄTEK DRUK @rdate ZESTAW @thisrdate = @rdate; ZESTAW @thisrnum = 0; KONIEC -- Typ pokoju wyboru formy dawkowania JEŚLI(@thisrnum <= @roomnum) POCZĄTEK IF (@thisrnum + @rmnum > @roomnum) POCZĄTEK -- Liczba pokoi, które musisz wykorzystać ZESTAW @rmnum = @roomnum-@thisrnum; KONIEC KONIEC ELSE POCZĄTEK -- Na ten dzień nie jest potrzebne miejsce ZESTAW @rmnum = 0; KONIEC
IF (@rmnum > 0) POCZĄTEK -- Dodaj wyniki według określonej liczby WSTAW DO ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, cena, dsumprice, davgprice, sumpric, sumavgpric) WYBIERZ @hid, '', @thisrdate, room_id, '', @rmnum, cena, 0, 0, 0, 0 OD ##temp_room GDZIE info_id = @infoid
-- Liczba pokoi osiągnęła obliczoną średnią cenę ZESTAW @thisrnum = @thisrnum + @rmnum; IF (@thisrnum = @roomnum) POCZĄTEK -- Całkowita cena według hotelu, obliczona dla dat AKTUALIZACJA ##temp_result USTAW dsumprice=(WYBIERZ SUM(room_num*roomprice) Z ##temp_result tr, GDZIE tr.hotel_id=@hid I TR.[ data]=@thisrdate) GDZIE hotel_id=@hid I [data]=@thisrdate -- Oblicz średnią cenę pokoju według hotelu, całkowitą cenę według daty AKTUALIZACJA ##temp_result USTAW davgprice=(dsumprice/@roomnum) GDZIE hotel_id=@hid I [data]=@thisrdate KONIEC KONIEC
PRZYNIEŚ DALEJ Z @my_cursor2 DO @infoid; KONIEC bliski @my_cursor2; --Wyłącz kursor deallocate @my_cursor2; --kurzor zwolnienia
-- Według hotelu oblicz całkowitą cenę hotelu AKTUALIZACJA ##temp_result USTAW sumpric=(WYBIERZ SUM(room_num*roomprice) Z ##temp_result tr GDZIE tr.hotel_id=@hid) GDZIE hotel_id=@hid -- Obliczanie średniej dziennej ceny całego pokoju w hotelu AKTUALIZACJA ##temp_result ZESTAW sumavgpric=(sumpric/@roomnum/@days) GDZIE hotel_id=@hid
POBIERZ NASTĘPNY z my_cursor do @hid – przejdź do następnego kursora, bez martwych pętli KONIEC Zamknij my_cursor – zamknij kursor Deallocate my_cursor - zwolnij kursor
-- Dodaj nazwę hotelu i typ pokoju do stolika tymczasowego AKTUALIZACJA ##temp_result USTAW hotel_name=(WYBIERZ ht.hotel_name Z dbo.hotel ht, GDZIE ht.hotel_id=##temp_result.hotel_id), room_name=(WYBIERZ rt.room_name Z dbo.room_type rt, GDZIE rt.room_id=##temp_result.room_id)
-- Sprawdź wyniki z tabeli wyników WYBIERZ * Z ##temp_result
-- Zakończenie czyszczenia tabel tymczasowych JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_hotel') i type='U') POCZĄTEK Drop table ##temp_hotel KONIEC JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_room') i type='U') POCZĄTEK Drop table ##temp_room KONIEC JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_result') i type='U') POCZĄTEK Drop table ##temp_result KONIEC
|