Tento príspevok naposledy upravovala Miaolinsen 6. 12. 2018 o 17:03
Nerobil som to s mysql, urobil som to s mssql:
/* Špecifikujte časový rozsah a počet izieb, ktoré sa majú rezervovať, dotazujte sa na hotely, výber typov izieb a ich priemerné ceny, ktoré spĺňajú podmienky (čas, počet zostávajúcich izieb), a zoradite ich podľa priemernej ceny od najnižšej po najvyššiu. Výsledky zahŕňajú hotely, vybrané kombinácie a množstvá izieb a najnižšiu priemernú cenu. ##不要求为同一房型, ale musí to byť ten istý hotel a môžete zmeniť typ izby uprostred. -- Parsovanie: Znamená to, že nie je potrebné zvažovať typ miestnosti, zohľadňuje sa len počet miestností ##比如, vyberte čas registrácie 2018-11-14~2018-11-15 a počet rezervovaných izieb je 5 -- Analýza: Hotel musí byť v danom časovom rozmedzí a každý deň je dopyt po počte izieb (ak v určitý deň nikto nie je, nespĺňa štandard) ##返回选择酒店A, 11-14 vyberte 4 typy izieb s ID 3, 1 typ izby s ID 2, 11-15 vyberte 3 typy izieb s ID 3, 2 typy izieb s ID 2 a najnižšia cena je 2000 -- Analýza: Vypočítajte priemernú cenu podľa minimálnej konfigurácie na deň ##老师要求只能用sql语句, implementácia mysql, nemôže používať python, c++ a podobne. */
-- Prichádzajúce parametre, dátumový rozsah, počet potrebných miestností DEKLARUJTE @sdate DÁTUM = '2018-11-14'; DEKLARUJTE @edate DÁTUM = '2018-11-15'; DEKLARUJTE @roomnum INT = 5;
-- Vypočítajte počet dní pobytu DEKLARUJTE @days INT; SET @days = DATEDIFF(DEŇ, @sdate, @edate)+1;
-- Číslo hotela, ktoré spĺňa časové rozpätie, počet izieb AK EXISTS(select * from tempdb.dbo.sysobjects, kde id = object_id(N'tempdb.. ##temp_hotel') a typ='U') ZAČIATOK drop table ##temp_hotel KONIEC
VYBERTE ta.hotel_id do ##temp_hotel Z (VYBERTE ri. [dátum], rt.hotel_id, SUM(ri.zostať) room_num Z room_info ri LEFT JOIN room_type rt na ri.room_id=rt.room_id kde @sdate <= [dátum] a [dátum] <= @edate SKUPINA PODĽA ri. [dátum],rt.hotel_id MÁ SUM(zostať) >= 5) ta ZOSKUPENIE PODĽA ta.hotel_id MÁ COUNT(*) = @days
-- Vypočítané podľa hotela (nastavte minimálny typ izby na deň)
AK EXISTS(select * from tempdb.dbo.sysobjects, kde id = object_id(N'tempdb.. ##temp_result') a typ='U') ZAČIATOK drop table ##temp_result KONIEC -- Predbežná tabuľka výsledkov Dátum izby v hoteli ID Typ izby Názov izby Počet izieb Cena izby Hotel Denný celkový počet Hotel Priemerná cena hotela Celková cena hotela Celková priemerná cena hotela Celková denná cena izby VYTVORIŤ TABUĽKU ##temp_result( hotel_id INT, hotel_name varchar(255), [dátum] DÁTUM, room_id INT, room_name VARCHAR(255), room_num INT, Izba DESATINNÉ, dsumprice DESATINNÉ, DAGPRICE DESATINNÁ ČÍSLA, sumpric DECIMAL, sumavgpric DESATINNÉ
)
DEKLARUJTE @hid INT; -- Hotelový preukaz DEKLARUJTE @infoid INT; -- informačné ID --potvrdiť, že kurzor je kolekcia DECLARE my_cursor kurzor pre (SELECT hotel_id z ##temp_hotel); --Otvor kurzor-- Otvorte my_cursor --Kurzorové premenné štartovacej slučky-- Prines ďalší z my_cursor do @hid zatiaľ čo @@FETCH_STATUS = 0 -- vracia stav posledného kurzora vykonaného príkazom FETCH -- ZAČIATOK -- Na základe hotelového ID sa účtuje opakujúci sa dátum AK EXISTS(select * from tempdb.dbo.sysobjects, kde id = object_id(N'tempdb.. ##temp_room') a typ='U') ZAČIATOK drop table ##temp_room KONIEC
-- Hotely podľa dátumu, s izbami zoradenými podľa dátumu Sadzba VYBERTE info_id, [dátum], cena, zostať room_id DO ##temp_room Z dbo.room_info KDE @sdate <= [dátum] a [dátum] <= @edate A ZOSTAŇTE > 0 A room_id V (VYBERTE rt.room_id Z dbo.room_type rt, KDE rt.hotel_id=@hid) PORADIE PODĽA [dátum] ASC, cena ASC
DECLARE @thisrdate DATE = NULL; -- Dátum DECLARE @thisrnum INT=0; -- Počet vybraných izieb k aktuálnemu dátumu
DECLARE @rdate DATE = NULL; -- Dátum DEKLARUJTE @rmnum INT = 0; -- Počet izieb podľa typu izby
-- Cyklus podľa dátumu DECLARE @my_cursor2 KURZOR; nastaviť @my_cursor2 = KURZOR PRE VÝBER info_id Z ##temp_room PORADIE PODĽA [dátum] ASC, cena ASC OTVORTE @my_cursor2; PRINES ĎALŠÍ Z @my_cursor2 DO @infoid WHILE(@@FETCH_STATUS=0) ZAČIATOK --##temp_result SELECT @rmnum=zostať, @rdate=[dátum] OD ##temp_room KDE info_id=@infoid AK (@thisrdate JE NULOVÝ ALEBO @thisrdate != @rdate) ZAČIATOK TLAČOVÁ @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; KONIEC -- Typ miestnosti pre výber dávkovacieho formulára AK(@thisrnum <= @roomnum) ZAČIATOK IF (@thisrnum + @rmnum > @roomnum) ZAČIATOK -- Počet izieb, ktoré musíš použiť SET @rmnum = @roomnum-@thisrnum; KONIEC KONIEC ELSE ZAČIATOK -- Na tento dátum nie je potrebná žiadna miestnosť NASTAVIŤ @rmnum = 0; KONIEC
IF (@rmnum > 0) ZAČIATOK -- Pridať výsledky podľa špecifikovaného počtu VLOŽTE DO ##temp_result(hotel_id, hotel_name, [dátum], 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 izieb dosiahol vypočítanú priemernú cenu SET @thisrnum = @thisrnum + @rmnum; AK (@thisrnum = @roomnum) ZAČIATOK -- Celková cena podľa hotela, vypočítaná pre dátumy AKTUALIZÁCIA ##temp_result NASTAVIŤ dsumprice=(SELECT SUM(room_num*roomprice) Z ##temp_result TR, KDE tr.hotel_id=@hid A TR.[ dátum]=@thisrdate) KDE hotel_id=@hid A [dátum]=@thisrdate -- Vypočítajte priemernú cenu izby podľa hotela, celkovú cenu podľa dátumu AKTUALIZÁCIA ##temp_result NASTAVIŤ davgprice=(dsumprice/@roomnum) KDE hotel_id=@hid A [dátum]=@thisrdate KONIEC KONIEC
PRINES ĎALEJ @my_cursor2 DO @infoid; KONIEC blízke @my_cursor2; --Vypni kurzor Deallocate @my_cursor2; --uvoľniť kurzor
-- Podľa hotela vypočítajte celkovú cenu hotela AKTUALIZÁCIA ##temp_result NASTAVIŤ sumpric=(SELECT SUM(room_num*roomprice) OD ##temp_result TR, KDE tr.hotel_id=@hid) KDE hotel_id=@hid -- Vypočítať priemernú dennú cenu celkovej izby v hoteli AKTUALIZÁCIA ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) KDE hotel_id=@hid
FETCH ďalej z my_cursor do @hid – choď na ďalší kurzor, žiadne mŕtve slučky KONIEC Zatvor my_cursor -- Zatvor kurzor Deallocate my_cursor - uvoľniť kurzor
-- Pridať názov hotela a typ izby na dočasný stôl AKTUALIZÁCIA ##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)
-- Skontrolujte výsledky z tabuľky výsledkov VYBERTE * Z ##temp_result
-- Dočasné tabuľky na konci čistenia AK EXISTS(select * from tempdb.dbo.sysobjects, kde id = object_id(N'tempdb.. ##temp_hotel') a typ='U') ZAČIATOK drop table ##temp_hotel KONIEC AK EXISTS(select * from tempdb.dbo.sysobjects, kde id = object_id(N'tempdb.. ##temp_room') a typ='U') ZAČIATOK drop table ##temp_room KONIEC AK EXISTS(select * from tempdb.dbo.sysobjects, kde id = object_id(N'tempdb.. ##temp_result') a typ='U') ZAČIATOK drop table ##temp_result KONIEC
|