Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 23250|Răspunde: 11

[Număr nou] Cum să alegi cele mai ieftine și camere

[Copiază linkul]
Postat pe 05.12.2018 21:32:38 | | | |
Acum există două tabele de folosit, room_type și room_info
Sunt 3 hoteluri cu acte de identitate 1~3. Apoi, fiecare hotel are 3 tipuri de camere, cu ID-uri de 1~9, respectiv.
room_type conține numele, ID-ul și ID-ul hotelului corespunzător fiecărui tip de cameră
Ceea ce este stocat în room_info este prețul fiecărei zile, fiecare tip de cameră și numărul de camere rămase.
Subiectele pe care aș dori să le adresez sunt:
Specifică intervalul de timp și numărul de camere de rezervat, interogă hotelurile, tipurile de camere și prețurile medii care corespund condițiilor (ora, numărul de camere rămase) și sortează-le după prețul mediu de la cel mai mic la cel mai mare. Rezultatele includ hoteluri, combinații și cantități selectate de camere, precum și cel mai mic preț mediu.
##不要求为同一房型, dar trebuie să fie același hotel și poți schimba tipul camerei la jumătate.
##比如, ora de check-in este 2018-11-14~2018-11-15, iar numărul de camere rezervate este 5
##返回选择酒店A, 11-14 selectați 4 tipuri de camere cu ID 3, 1 tip de cameră cu ID 2, 11-15 selectați 3 tipuri de camere cu ID 3, 2 tipuri de camere cu ID 2, iar cel mai mic preț este 2000
##老师要求只能用sql语句, implementarea MySQL nu poate folosi Python, C++ etc
Nu am scris-o timp de o zi și nu am văzut un subiect similar pe Internet, așa că am venit să cer ajutorul zeilor și vreau să te întreb cum să reușesc, mulțumesc~







Precedent:Împărtășirea experienței auto-raportate de maimuța programului PHP
Următor:Politica examenului postuniversitar 2019 Materialele de sprint ale lui Xu Tao și Xiao Xiurong
Postat pe 06.12.2018 17:00:58 |
Această postare a fost editată ultima dată de Miaolinsen pe 2018-12-6 17:03

Nu am făcut-o cu mysql, am făcut-o cu mssql:


/*
Specifică intervalul de timp și numărul de camere de rezervat, interogă hotelurile, tipurile de camere și prețurile medii care corespund condițiilor (ora, numărul de camere rămase) și sortează-le după prețul mediu de la cel mai mic la cel mai mare. Rezultatele includ hoteluri, combinații și cantități selectate de camere, precum și cel mai mic preț mediu.
##不要求为同一房型, dar trebuie să fie același hotel și poți schimba tipul camerei la jumătate. -- Parsing: Înseamnă că nu este nevoie să se ia în considerare tipul camerei, doar numărul de camere este luat în considerare
##比如, selectați ora de check-in 2018-11-14~2018-11-15, iar numărul de camere rezervate este 5 -- Analiză: Hotelul trebuie să fie în intervalul de date și există cerere pentru numărul de camere pe zi (dacă nu există nimeni într-o anumită zi, nu va îndeplini standardul)
##返回选择酒店A, 11-14 selectează 4 tipuri de camere cu ID 3, 1 tip de cameră cu ID 2, 11-15 selectează 3 tipuri de camere cu ID 3, 2 tipuri de camere cu ID 2, iar cel mai mic preț este 2000 -- Analiză: Calculează prețul mediu conform configurației minime pe zi
##老师要求只能用sql语句, implementare mysql, nu poate folosi python, c++ etc. */


-- Parametri de intrare interval de date, număr de camere necesare
DECLARAȚI DATA @sdate = '2018-11-14';
DECLARAȚI DATA @edate = '2018-11-15';
DECLARAȚI @roomnum INT = 5;


-- Calculează numărul de zile de ședere
DECLARĂ @days INT;
SET @days = DATEDIFF(ZI, @sdate, @edate)+1;

-- Numărul hotelului care corespunde intervalului de date, numărul de camere
IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_hotel') și tip='U')
START
    Drop Table ##temp_hotel
SFÂRȘIT

SELECTEAZĂ ta.hotel_id în ##temp_hotel DE LA
(SELECT ri. [data], rt.hotel_id, SUM(ri.remain) room_num DIN room_info ri LEFT JOIN room_type rt pe ri.room_id=rt.room_id unde @sdate <= [data] și [data] <= @edate GRUP CU ri. [data],rt.hotel_id AVÂND SUMĂ(rămâne) >= 5) ta
GRUPAȚI DUPĂ ta.hotel_id AVÂND COUNT(*) = @days



-- Calculat în funcție de hotel (configurează tipul minim de cameră pe zi)

IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_result') și tip='U')
START
    Drop Table ##temp_result
SFÂRȘIT
-- Tabel provizoriu de rezultate Hotel Date Date Tip ID cameră Tip Nume cameră Număr camere Preț cameră Hotel Zilnic Total hotel Preț mediu zilnic Hotel Hotel Total hotel Total Preț mediu zilnic Hotel Total Preț zilnic al camerei
CREEAZĂ TABELUL ##temp_result(
    hotel_id INT,
    hotel_name varchar (255),
    [data] DATA,
    room_id INT,
    room_name VARCHAR (255),
    room_num INT,
    Prețul camerei ZECIMAL,
    dsumprice DECIMAL,
    davgprice DECIMAL,
    sumric DECIMAL,
    ZECIMALUL sumavgpric
)

DECLARĂ @hid INT; -- ID hotel
DECLARĂ @infoid INT; -- info id
--afirmă că cursorul este o colecție
DECLARE my_cursor cursor pentru (SELECT hotel_id din ##temp_hotel);
--Cursor deschis--
Deschide my_cursor
--Variabile cursor de buclă start--
Adu-i apoi de la my_cursor în @hid
în timp ce @@FETCH_STATUS = 0 -- returnează starea ultimului cursor executat de instrucțiunea FETCH --
START      
    -- Pe baza ID-ului hotelului, data recurentă este evaluată
    IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_room') și tip='U')
    START
        Drop Table ##temp_room
    SFÂRȘIT

    -- Hoteluri, după dată, cu camere sortate după dată Tarif
    SELECTAȚI info_id, [dată], preț, rămâneți room_id ÎN ##temp_room DIN dbo.room_info UNDE @sdate <= [dată] și [dată] <= @edate ȘI rămâneți > 0 ȘI room_id ÎN (SELECTAȚI rt.room_id DIN dbo.room_type rt UNDE rt.hotel_id=@hid) COMANDĂ DUPĂ [data] ASC, preț ASC
   
   
    DECLARE @thisrdate DATĂ = NUL; -- Date
    DECLARĂ @thisrnum INT=0; -- Numărul de camere selectate la data curentă
   
    DECLARE @rdate DATĂ = NUL; -- Date
    DECLARAȚI @rmnum INT = 0; -- Numărul de camere după tipul camerei
   
    -- Ciclează după dată
    DECLARAȚI @my_cursor2 CURSOR;
    setați @my_cursor2 = CURSOR PENTRU SELECT info_id DIN ##temp_room COMANDĂ DUPĂ [data] ASC, preț ASC
    DESCHIDE @my_cursor2;
    ADU APOI DE LA @my_cursor2 ÎN @infoid
    WHILE(@@FETCH_STATUS=0)
    START
        --##temp_result
        SELECT @rmnum=remain, @rdate=[data] DIN ##temp_room UNDE info_id=@infoid
        DACĂ (@thisrdate ESTE NUL SAU @thisrdate != @rdate)
        START
            PRINT @rdate
            MULȚIMEA @thisrdate = @rdate;
            MULȚIMEA @thisrnum = 0;
        SFÂRȘIT
        -- Tipul camerei de selecție a formei dozale
        DACĂ(@thisrnum <= @roomnum)
        START
            IF (@thisrnum + @rmnum > @roomnum)
            START
                -- Numărul de camere pe care trebuie să le folosești
                MULȚIMEA @rmnum = @roomnum-@thisrnum;
            SFÂRȘIT
        SFÂRȘIT
        ALTFEL   
        START
            -- Nu este necesară nicio cameră pentru acea dată
            MULȚIMEA @rmnum = 0;
        SFÂRȘIT
        
        DACĂ (@rmnum > 0)
        START
            -- Adaugă rezultatele după numărul specificat
            INSERAȚI ÎN ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, preț camere, dsumprice, davgprice, sumpric, sumavgpric)
            SELECTAȚI @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 DE LA ##temp_room UNDE info_id = @infoid
            
            -- Numărul camerelor a atins prețul mediu calculat
            MULȚIMEA @thisrnum = @thisrnum + @rmnum;
            DACĂ (@thisrnum = @roomnum)
            START
                -- Prețul total pe hotel, calculat pentru date
                ACTUALIZARE ##temp_result SETEAZĂ dsumprice=(SELECT SUM(room_num*roomprice) DIN ##temp_result tr UNDE tr.hotel_id=@hid ȘI TR.[ data]=@thisrdate) UNDE hotel_id=@hid ȘI [data]=@thisrdate
                -- Calculează tariful mediu al camerei pe hotel, prețul total după dată
                ACTUALIZARE ##temp_result SET davgprice=(dsumprice/@roomnum) UNDE hotel_id=@hid ȘI [data]=@thisrdate
            SFÂRȘIT
        SFÂRȘIT

        ADUCĂ APOI DE LA @my_cursor2 ÎN @infoid;
    SFÂRȘIT   
    aproape @my_cursor2;  --Oprește cursorul
    deallocate @my_cursor2;   --eliberează cursorul

    -- Pe hotel, se calculează prețul total al hotelului
    ACTUALIZARE ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) DIN ##temp_result TR UNDE tr.hotel_id=@hid) UNDE hotel_id=@hid
    -- Calculează prețul mediu zilnic al totalului camerei din hotel
    ACTUALIZARE ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) UNDE hotel_id=@hid

    FETCH next de la my_cursor la @hid - treci la următorul cursor, fără deadloop-uri
SFÂRȘIT  
Închide my_cursor -- închide cursorul
Deallocate my_cursor - eliberează cursorul


-- Adaugă numele hotelului și tipul camerei pe tabelul temporar
ACTUALIZARE ##temp_result SET hotel_name=(SELECT ht.hotel_name FROM dbo.hotel ht UNDE ht.hotel_id=##temp_result.hotel_id),
room_name=(SELECT rt.room_name FROM dbo.room_type rt UNDE rt.room_id=##temp_result.room_id)


-- Verifică rezultatele din tabelul de rezultate
SELECTEAZĂ * DIN ##temp_result




-- Sfârșitul curățării tabelelor temporare
IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_hotel') și tip='U')
START
    Drop Table ##temp_hotel
SFÂRȘIT
IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_room') și tip='U')
START
    Drop Table ##temp_room
SFÂRȘIT
IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_result') și tip='U')
START
    Drop Table ##temp_result
SFÂRȘIT

Scor

Numărul participanților1MB+1 Contribui+1 Colaps rațiune
Admin + 1 + 1 Entuziasmat să ajuți pe alții!

Vezi toate ratingurile

 Proprietarul| Postat pe 06.12.2018 14:11:48 |
xzxmustwin Postat pe 2018-12-6 11:58
Sincer, structura acestui tabel este puțin nerezonabilă

Întrebările de teme date de profesorul din baza de date emmmm pot fi într-adevăr nerezonabile, și nu le-am văzut dacă nu le-am învățat foarte bine...
Totuși, cheia rămâne ideile de rezolvare a problemelor, vreau să întreb prietenii mei dacă aveți sugestii?
 Proprietarul| Postat pe 06.12.2018 14:09:20 |
LZZSF Postat pe 2018-12-6 09:07
MySQL este depășit, fără client, dă-mi scriptul pentru SQL Server

Ne pare rău, nu am folosit încă SQL Server, poate pentru că doar predă, așa că profesorul ne-a rugat să folosim mysql pentru asta. Dacă prietenii tăi sunt dispuși să-și împărtășească ideile, îți mulțumesc mult.
Postat pe 05.12.2018 21:57:13 |
Voi merge la grupul QQ să ofer o recompensă de 10 yuani să văd dacă cineva te poate ajuta să răspunzi nu
Postat pe 06.12.2018 07:56:39 |
Ajutor
Postat pe 06.12.2018 09:07:08 |
MySQL este depășit, fără client, dă-mi scriptul pentru SQL Server

Scor

Numărul participanților1MB+1 Contribui+1 Colaps rațiune
Admin + 1 + 1 Entuziasmat!

Vezi toate ratingurile

Postat pe 06.12.2018 11:24:25 |
LZZSF Postat pe 2018-12-6 09:07
MySQL este depășit, fără client, dă-mi scriptul pentru SQL Server

Se recomandă să discutați despre idee și să lăsați proprietarul să o folosească ca referință, ceea ce ar trebui să fie posibil
Postat pe 06.12.2018 11:58:37 |
Sincer, structura acestui tabel este puțin nerezonabilă

Scor

Numărul participanților1MB+1 Contribui+1 Colaps rațiune
Admin + 1 + 1 Entuziasmat!

Vezi toate ratingurile

 Proprietarul| Postat pe 06.12.2018 14:07:29 |
Publicat la 2018-12-5, 21:57
Voi merge la grupul QQ să ofer o recompensă de 10 yuani să văd dacă cineva te poate ajuta să răspunzi nu

Mulțumesc, dacă cineva este dispus să răspundă, vă trimit plicul roșu :)
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com