Tento příspěvek byl naposledy upraven Miaolinsenem dne 6. 12. 2018 v 17:03
Nedělal jsem to s mysql, ale s mssql:
/* Určete časové rozmezí a počet rezervovaných pokojů, vypytujte se na hotely, typy pokojů a jejich průměrné ceny, které splňují podmínky (čas, počet zbývajících pokojů), a seřadíte je podle průměrné ceny od nejnižší po nejvyšší. Výsledky zahrnují hotely, vybrané kombinace a množství pokojů a nejnižší průměrnou cenu. ##不要求为同一房型, ale musí to být stejný hotel a můžete změnit typ pokoje během cesty. -- Parsování: To znamená, že není třeba zvažovat typ místnosti, pouze počet místností ##比如, vyberte čas přihlášení 2018-11-14~2018-11-15 a počet rezervovaných pokojů je 5 -- Analýza: Hotel musí být v datovém rozmezí a je poptávka po počtu pokojů každý den (pokud v určitý den nikdo není, nesplní standard) ##返回选择酒店A, 11-14 vyberte 4 typy pokojů s ID 3, 1 typ pokoje s ID 2, 11-15 vyberte 3 typy pokojů s ID 3, 2 typy pokojů s ID 2 a nejvyšší cena je 2000 -- Analýza: Vypočítat průměrnou cenu podle minimální konfigurace za den ##老师要求只能用sql语句, implementace mysql, nemůže používat python, c++ atd. */
-- Příchozí parametry, datový rozsah, počet potřebných místností DEKLARUJTE @sdate DATUM = '2018-11-14'; DEKLARUJTE @edate DATUM = '2018-11-15'; DEKLARUJTE @roomnum INT = 5;
-- Spočítejte počet dní pobytu DEKLARUJTE @days INT; SET @days = DATEDIFF(DEN, @sdate, @edate)+1;
-- Číslo hotelu, které odpovídá datovému rozmezí, počet pokojů POKUD EXISTUJE(vyberte * z tempdb.dbo.sysobjects kde id = object_id(N'tempdb.. ##temp_hotel') a typ='U') ZAČNĚTE Drop table ##temp_hotel KONEC
VYBERTE ta.hotel_id do ##temp_hotel Z (VYBRAT ri. [datum], rt.hotel_id, SUM(ri.zůstat) room_num Z room_info RI LEFT JOIN room_type rt na ri.room_id=rt.room_id kde @sdate <= [datum] a [datum] <= @edate SKUPINA PODLE ri. [datum],rt.hotel_id MÍT SUM(zůstat) >= 5) ta ZAŘAĎTE PODLE ta.hotel_id MÁ COUNT(*) = @days
-- Vypočítané podle hotelu (nastavte minimální typ pokoje na den)
POKUD EXISTUJE(vyberte * z tempdb.dbo.sysobjects kde id = object_id(N'tempdb.. ##temp_result') a type='U') ZAČNĚTE Drop table ##temp_result KONEC -- Provizorní tabulka výsledků Hotelová rande Typ pokoje ID Typ pokoje Název pokojů Počet pokojů Cena hotelu Denní celkový počet Hotel Denní průměrná cena hotelu Hotel Celková cena hotelu Celková denní průměrná cena hotelu Celková denní cena pokoje VYTVOŘIT TABULKU ##temp_result( hotel_id INT, hotel_name varchar(255), [datum] DATUM, room_id INT, room_name VARCHAR(255), room_num INT, roomprice DECIMAL, dsumprice DESETINNÉ ČÍSLO, DAVGPRICE DESETINNÁ ČÍSLA, sumpric DECIMAL, sumavgpric DECIMAL
)
DEKLARUJTE @hid INT; -- Hotelový průkaz DEKLARUJTE @infoid INT; -- informační ID --potvrdit, že kurzor je kolekce DECLARE my_cursor kurzor pro (SELECT hotel_id z ##temp_hotel); --Otevřít kurzor-- Otevři my_cursor --Proměnné kurzoru smyčky startu-- Přines další z my_cursor do @hid zatímco @@FETCH_STATUS = 0 -- vrací stav posledního kurzoru vykonaného příkazem FETCH -- ZAČNĚTE -- Na základě ID hotelu se účtuje opakované datum POKUD EXISTUJE(vyberte * z tempdb.dbo.sysobjects kde id = object_id(N'tempdb.. ##temp_room') a type='U') ZAČNĚTE Drop table ##temp_room KONEC
-- Hotely podle data, s pokoji seřazenými podle data Cena VYBERTE info_id, [datum], cena, zůstat room_id DO ##temp_room Z dbo.room_info KDE @sdate <= [datum] a [datum] <= @edate A ZŮSTAŇTE > 0 A room_id DO (VYBERTE rt.room_id Z dbo.room_type rt, KDE rt.hotel_id=@hid) OBJEDNÁVKA PODLE [datum] ASC, cena ASC
DECLARE @thisrdate DATE = NULL; -- Datum DEKLARUJTE @thisrnum INT=0; -- Počet vybraných pokojů k aktuálnímu datu
DECLARE @rdate DATE = NULL; -- Datum DEKLARUJTE @rmnum INT = 0; -- Počet pokojů podle typu místnosti
-- Cyklus podle data DECLARE @my_cursor2 KURZORU; nastavte @my_cursor2 = KURZOR PRO SELECT info_id Z ##temp_room POŘADÍ PODLE [datum] ASC, cena ASC OTEVŘETE @my_cursor2; APORTUJ DALŠÍ OD @my_cursor2 DO @infoid WHILE(@@FETCH_STATUS=0) ZAČNĚTE --##temp_result SELECT @rmnum=zůstat, @rdate=[datum] OD ##temp_room KDE info_id=@infoid POKUD (@thisrdate JE NULOVÁ NEBO @thisrdate != @rdate) ZAČNĚTE TISKOVÁ @rdate SADA @thisrdate = @rdate; SET @thisrnum = 0; KONEC -- Typ místnosti pro výběr dávkovacích form IF(@thisrnum <= @roomnum) ZAČNĚTE IF (@thisrnum + @rmnum > @roomnum) ZAČNĚTE -- Počet pokojů, které musíte použít SADA @rmnum = @roomnum-@thisrnum; KONEC KONEC DALŠÍ ZAČNĚTE -- Na toto datum není potřeba žádné místo NASTAVTE @rmnum = 0; KONEC
IF (@rmnum > 0) ZAČNĚTE -- Přičíst výsledky podle stanoveného počtu VLOŽTE DO ##temp_result(hotel_id, hotel_name, [datum], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) VYBERTE @hid, '', @thisrdate, room_id, '', @rmnum, cena, 0, 0, 0 OD ##temp_room KDE info_id = @infoid
-- Počet pokojů dosáhl vypočítané průměrné ceny SADA @thisrnum = @thisrnum + @rmnum; IF (@thisrnum = @roomnum) ZAČNĚTE -- Celková cena podle hotelu, vypočítána pro data AKTUALIZACE ##temp_result NASTAVTE dsumprice=(VYBERTE SUM(room_num*roomprice) Z ##temp_result TR, KDE tr.hotel_id=@hid A TR.[ datum]=@thisrdate) KDE hotel_id=@hid A [datum]=@thisrdate -- Vypočítat průměrnou cenu pokojů podle hotelu, celkovou cenu podle data AKTUALIZACE ##temp_result NASTAVTE davgprice=(dsumprice/@roomnum) KDE hotel_id=@hid A [datum]=@thisrdate KONEC KONEC
FETCH NEXT Z @my_cursor2 DO @infoid; KONEC blízké @my_cursor2; --Vypni kurzor deallocate @my_cursor2; --kurzor pro uvolnění
-- Podle hotelu vypočítejte celkovou cenu hotelu AKTUALIZACE ##temp_result NASTAVTE sumpric=(VYBERTE SUM(room_num*roomprice) OD ##temp_result TR, KDE tr.hotel_id=@hid) KDE hotel_id=@hid -- Vypočítat průměrnou denní cenu celého pokoje v hotelu AKTUALIZACE ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) KDE hotel_id=@hid
FETCH next z my_cursor do @hid – jdi na další kurzor, žádné mrtvé smyčky KONEC Zavřít my_cursor – zavřít kurzor deallocate my_cursor - uvolnit kurzor
-- Přidejte název hotelu a typ pokoje k dočasnému stolu AKTUALIZACE ##temp_result NASTAVTE hotel_name=(VYBERTE ht.hotel_name Z dbo.hotel HT, KDE ht.hotel_id=##temp_result.hotel_id), room_name=(VYBERTE rt.room_name Z dbo.room_type rt, KDE rt.room_id=##temp_result.room_id)
-- Zkontrolujte výsledky z tabulky výsledků VYBERTE * Z ##temp_result
-- Ukončení vyčištění dočasných tabulek POKUD EXISTUJE(vyberte * z tempdb.dbo.sysobjects kde id = object_id(N'tempdb.. ##temp_hotel') a typ='U') ZAČNĚTE Drop table ##temp_hotel KONEC POKUD EXISTUJE(vyberte * z tempdb.dbo.sysobjects kde id = object_id(N'tempdb.. ##temp_room') a type='U') ZAČNĚTE Drop table ##temp_room KONEC POKUD EXISTUJE(vyberte * z tempdb.dbo.sysobjects kde id = object_id(N'tempdb.. ##temp_result') a type='U') ZAČNĚTE Drop table ##temp_result KONEC
|