Questo post è stato modificato l'ultima volta da Miaolinsen il 6-12-2018 alle 17:03
Non l'ho fatto con mysql, l'ho fatto con mssql:
/* Specifica l'intervallo di tempo e il numero di camere da prenotare, consulta gli hotel, le opzioni di tipo di camere e i prezzi medi che soddisfano le condizioni (ora, numero di camere rimanenti) e ordinali per prezzo medio dal più basso al più alto. I risultati includono hotel, combinazioni e quantità selezionate di camere, e il prezzo medio più basso. ##不要求为同一房型, ma deve essere lo stesso hotel, e puoi cambiare il tipo di stanza a metà. -- Analisi sintica: significa che non è necessario considerare il tipo di stanza, si considera solo il numero di stanze ##比如, seleziona l'orario di check-in 2018-11-14~2018-11-15, e il numero di camere prenotate è 5 -- Analisi: L'hotel deve essere nell'intervallo di date e c'è domanda per il numero di camere ogni giorno (se non ce n'è nessuno in un determinato giorno, non soddisferà lo standard) ##返回选择酒店A, 11-14 selezionano 4 tipi di stanza con ID 3, 1 tipo di stanza con ID 2, 11-15 selezionano 3 tipi di stanza con ID 3, 2 tipi di stanza con ID 2, e il prezzo più basso è 2000 -- Analisi: Calcola il prezzo medio in base alla configurazione minima al giorno ##老师要求只能用sql语句, implementazione mysql, non può usare python, c++, ecc. */
-- Parametri in ingresso intervallo di date, numero di stanze richieste DICHIARARE @sdate DATA = '2018-11-14'; DICHIARARE @edate DATA = '2018-11-15'; DICHIARARE @roomnum INT = 5;
-- Calcolare il numero di giorni di soggiorno DICHIARARE @days INT; SET @days = DATEDIFF(DAY, @sdate, @edate)+1;
-- Numero dell'hotel che corrisponde all'intervallo di date, numero di camere IF EXISTS(select * da tempdb.dbo.sysobjects dove id = object_id(N'tempdb.. ##temp_hotel') e tipo='U') INIZIO Tabella di caduta ##temp_hotel FINE
SELEZIONA ta.hotel_id in ##temp_hotel DA (SELECT ri. [data], rt.hotel_id, SUM(ri.remain) room_num DA room_info ri JOIN SINISTRA room_type rt su ri.room_id=rt.room_id dove @sdate <= [data] e [data] <= @edate GRUPPO PER ri. [data],rt.hotel_id AVERE SOMMA (rimane) >= 5) ta RAGGRUPPARE PER ta.hotel_id AVERE COUNT(*) = @days
-- Calcolato in base all'hotel (configura il tipo minimo di stanza al giorno)
IF EXISTS(select * da tempdb.dbo.sysobjects dove id = object_id(N'tempdb.. ##temp_result') e tipo='U') INIZIO Tabella di caduta ##temp_result FINE -- Tabella Provvisoria dei Risultati Hotel Appuntamento Tipo Stanza ID Nome Stanza Nome Numero di Camere Prezzo della Stanza Hotel Giornaliero Totale Hotel Prezzo medio giornaliero Hotel Prezzo totale hotel Prezzo medio giornaliero Prezzo totale giornaliero dell'hotel Prezzo totale giornaliero della stanza CREA TABELLA ##temp_result( hotel_id INT, hotel_name varchar (255), [data] DATA, room_id INT, room_name VARCHAR (255), room_num INT, Prezzo della stanza DECIMALE, dsumprice DECIMAL, davgprice DECIMAL, DECIMALE sumprico, DECIMALE sumavgpric
)
DICHIARARE @hid INT; -- ID dell'hotel DICHIARARE @infoid INT; -- info id --affermare che il cursore è una collezione DICHIARA my_cursor cursore per (SELEZIONA hotel_id da ##temp_hotel); --Cursore aperto-- Aperto my_cursor --Variabili cursore del ciclo di avvio-- Riporta il prossimo da my_cursor in @hid mentre @@FETCH_STATUS = 0 -- restituisce lo stato dell'ultimo cursore eseguito dall'istruzione FETCH -- INIZIO -- In base all'ID dell'hotel, la data ricorrente è fissata IF EXISTS(select * da tempdb.dbo.sysobjects dove id = object_id(N'tempdb.. ##temp_room') e tipo='U') INIZIO Tabella di caduta ##temp_room FINE
-- Hotel, per data, con camere ordinate per data Tariffa SELEZIONA info_id, [data], price, remain, room_id IN ##temp_room DA dbo.room_info DOVE @sdate <= [data] e [data] <= @edate E RIMANERE > 0 E room_id IN (SELEZIONA rt.room_id DA dbo.room_type rt DOVE rt.hotel_id=@hid) ORDINE PER [data] ASC, prezzo ASC
DICHIARA @thisrdate DATA = NULLO; -- Data DICHIARA @thisrnum INT=0; -- Numero di stanze selezionate nella data attuale
DICHIARA @rdate DATA = NULLO; -- Data DICHIARARE @rmnum INT = 0; -- Numero di stanze per tipo di stanza
-- Cicla per data DICHIARARE @my_cursor2 CURSORE; imposta @my_cursor2 = CURSORE PER SELEZIONARE info_id DA ##temp_room ORDINE PER [data] ASC, prezzo ASC OPEN @my_cursor2; PRENDI IL PROSSIMO DA @my_cursor2 IN @infoid MENTRE(@@FETCH_STATUS=0) INIZIO --##temp_result SELEZIONA @rmnum=rimane, @rdate=[data] DA ##temp_room DOVE info_id=@infoid SE (@thisrdate È NULLO O @thisrdate != @rdate) INIZIO STAMPA @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; FINE -- Tipo di stanza per la selezione della forma dosologica SE(@thisrnum <= @roomnum) INIZIO SE (@thisrnum + @rmnum > @roomnum) INIZIO -- Il numero di stanze che devi usare SET @rmnum = @roomnum-@thisrnum; FINE FINE ALTRO INIZIO -- Non è richiesta una stanza per quella data SET @rmnum = 0; FINE
SE (@rmnum > 0) INIZIO -- Aggiungere i risultati per numero specificato INSERIRE IN ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, prezzo della stanza, dsumprice, davgprice, sumpric, sumavgpric) SELEZIONA @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 DA ##temp_room DOVE info_id = @infoid
-- Il numero di camere ha raggiunto il prezzo medio calcolato SET @thisrnum = @thisrnum + @rmnum; SE (@thisrnum = @roomnum) INIZIO -- Prezzo totale per hotel, calcolato per date AGGIORNAMENTO ##temp_result IMPOSTARE dsumprice=(SELECT SUM(room_num*roomprice) DA ##temp_result tr DOVE tr.hotel_id=@hid E TR.[ data]=@thisrdate) DOVE hotel_id=@hid E [data]=@thisrdate -- Calcolare la tariffa media della stanza per hotel, prezzo totale per data AGGIORNAMENTO ##temp_result IMPOSTARE davgprice=(dsumprice/@roomnum) DOVE hotel_id=@hid E [data]=@thisrdate FINE FINE
PRENDI IL PROSSIMO DA @my_cursor2 IN @infoid; FINE Close @my_cursor2; --Spegni il cursore Deallocate @my_cursor2; --rilasciare il cursore
-- Per hotel, calcola il prezzo totale dell'hotel AGGIORNAMENTO ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) DA ##temp_result TR DOVE tr.hotel_id=@hid) DOVE hotel_id=@hid -- Calcolare il prezzo medio giornaliero della stanza totale dell'hotel AGGIORNAMENTO ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) DOVE hotel_id=@hid
FETCH next da my_cursor a @hid - passare al cursore successivo, nessun deadloop FINE Chiudi my_cursor -- Chiudi il cursore Deallocate my_cursor - Rilascia il cursore
-- Aggiungere il nome dell'hotel e il nome del tipo di stanza alla tabella temporanea AGGIORNAMENTO ##temp_result SET hotel_name=(SELEZIONA ht.hotel_name DA dbo.hotel ht DOVE ht.hotel_id=##temp_result.hotel_id), room_name=(SELEZIONA rt.room_name DA dbo.room_type rt DOVE rt.room_id=##temp_result.room_id)
-- Controlla i risultati dalla tabella dei risultati SELEZIONA * DA ##temp_result
-- Fine delle tabelle temporanee IF EXISTS(select * da tempdb.dbo.sysobjects dove id = object_id(N'tempdb.. ##temp_hotel') e tipo='U') INIZIO Tabella di caduta ##temp_hotel FINE IF EXISTS(select * da tempdb.dbo.sysobjects dove id = object_id(N'tempdb.. ##temp_room') e tipo='U') INIZIO Tabella di caduta ##temp_room FINE IF EXISTS(select * da tempdb.dbo.sysobjects dove id = object_id(N'tempdb.. ##temp_result') e tipo='U') INIZIO Tabella di caduta ##temp_result FINE
|