Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 23250|Atsakyti: 11

[Naujas numeris] Kaip išsirinkti pigiausius n kambarius

[Kopijuoti nuorodą]
Paskelbta 2018-12-05 21:32:38 | | | |
Dabar yra dvi lentelės, kurias galima naudoti, room_type ir room_info
Yra 3 viešbučiai su asmens tapatybės dokumentais 1~3. Tada kiekviename viešbutyje yra 3 kambarių tipai, kurių ID yra atitinkamai 1 ~ 9.
room_type yra kiekvieno kambario tipo pavadinimas, ID ir atitinkamas viešbučio ID
room_info saugoma kiekvienos dienos kaina, kiekvieno kambario tipas ir likusių kambarių skaičius.
Temos, kurias norėčiau paklausti, yra šios:
Nurodykite laiko intervalą ir užsakomų kambarių skaičių, užklauskite viešbučių, kambarių tipų pasirinkimą ir jų vidutines kainas, atitinkančias sąlygas (laiką, likusių kambarių skaičių), ir rūšiuokite juos pagal vidutinę kainą nuo mažiausios iki didžiausios. Rezultatai apima viešbučius, pasirinktus kambarių derinius ir kiekius bei mažiausią vidutinę kainą.
##不要求为同一房型, bet tai turi būti tas pats viešbutis, o kambario tipą galite pakeisti pusiaukelėje.
##比如, atvykimo laikas yra 2018-11-14~2018-11-15, o užsakytų kambarių skaičius yra 5
##返回选择酒店A, 11-14 pasirinkite 4 kambarių tipus su ID 3, 1 kambario tipą su ID 2, 11-15 pasirinkite 3 kambarių tipus su ID 3, 2 kambarių tipus su ID 2, o mažiausia kaina yra 2000
##老师要求只能用sql语句, MySQL diegimas negali naudoti Python, C++ ir kt
Aš to nerašiau nė dienos, o panašios temos internete nemačiau, todėl atėjau paprašyti dievų pagalbos, ir noriu paklausti, kaip tai pasiekti, ačiū~







Ankstesnis:PHP programos beždžionės savarankiškai pranešė patirties dalijimasis
Kitą:2019 m. antrosios pakopos stojamojo egzamino politika Xu Tao ir Xiao Xiurong sprinto medžiaga
Paskelbta 2018-12-06 17:00:58 |
Šį pranešimą paskutinį kartą redagavo Miaolinsen 2018-12-6 17:03

Aš to nepadariau su mysql, aš tai padariau su mssql:


/*
Nurodykite laiko intervalą ir užsakomų kambarių skaičių, užklauskite viešbučių, kambarių tipų pasirinkimą ir jų vidutines kainas, atitinkančias sąlygas (laiką, likusių kambarių skaičių), ir rūšiuokite juos pagal vidutinę kainą nuo mažiausios iki didžiausios. Rezultatai apima viešbučius, pasirinktus kambarių derinius ir kiekius bei mažiausią vidutinę kainą.
##不要求为同一房型, bet tai turi būti tas pats viešbutis, o kambario tipą galite pakeisti pusiaukelėje. -- Analizė: Tai reiškia, kad nereikia atsižvelgti į kambario tipą, atsižvelgiama tik į kambarių skaičių
##比如, pasirinkite atvykimo laiką 2018-11-14~2018-11-15, o užsakytų kambarių skaičius yra 5 -- Analizė: Viešbutis turi būti datų diapazone, o kambarių skaičius yra paklausus kiekvieną dieną (jei tam tikrą dieną nieko nėra, jis neatitiks standarto)
##返回选择酒店A, 11-14 pasirinkite 4 kambarių tipus su ID 3, 1 kambario tipą su ID 2, 11-15 pasirinkite 3 kambarių tipus su ID 3, 2 kambarių tipus su ID 2, o mažiausia kaina yra 2000 -- Analizė: Apskaičiuokite vidutinę kainą pagal minimalią konfigūraciją per dieną
##老师要求只能用sql语句, MySQL įgyvendinimas, negali naudoti Python, C++ ir kt. */


-- Gaunami parametrai datų diapazonas, reikalingų kambarių skaičius
DEKLARUOTI @sdate DATĄ = '2018-11-14';
DEKLARUOTI @edate DATĄ = '2018-11-15';
DEKLARUOKITE @roomnum INT = 5;


-- Apskaičiuokite buvimo dienų skaičių
DEKLARUOTI @days INT;
SET @days = DATEDIFF(DAY, @sdate, @edate)+1;

-- Viešbučio numeris, atitinkantis dienų seką, kambarių skaičius
IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_hotel') ir type='U')
PRADĖTI
    Išmeskite lentelę ##temp_hotel
PABAIGA

PASIRINKITE ta.hotel_id į ##temp_hotel NUO
(SELECT ri. [data], rt.hotel_id, SUM(ri.remain) room_num FROM room_info ri LEFT JOIN room_type rt on ri.room_id=rt.room_id kur @sdate <= [date] ir [date] <= @edate GROUP BY ri. [data],rt.hotel_id TURINTYS SUM(likti) >= 5) ta
GRUPUOTI PAGAL ta.hotel_id, KURIŲ COUNT(*) = @days



-- Skaičiuojama pagal viešbutį (sukonfigūruokite minimalų kambario tipą per dieną)

IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_result') ir type='U')
PRADĖTI
    Išmeskite lentelę ##temp_result
PABAIGA
-- Preliminari rezultatų lentelė Viešbučio data Kambario tipas ID Kambario tipas Pavadinimas Kambarių skaičius Kambario kaina Viešbutis Diena Bendra viešbučio kaina Viešbutis Bendra dienos kaina Viešbutis Bendra dienos kaina Viešbutis Bendra dienos kaina Viešbučio kaina
SUKURTI LENTELĘ ##temp_result(
    hotel_id INT,
    hotel_name varchar(255),
    [data] DATA,
    room_id INT,
    room_name VARCHAR [255],
    room_num INT,
    kambario kaina dešimtainė,
    dsumprice DECIMALINIS,
    davgprice DEŠIMTAINIS,
    sumpric DEŠIMTAINĖ,
    sumavgpric DECIMAL
)

DEKLARUOTI @hid INT; -- Viešbučio ID
DEKLARUOTI @infoid INT; -- info id
--patvirtinti, kad žymeklis yra rinkinys
DECLARE my_cursor žymeklį (SELECT hotel_id iš ##temp_hotel);
--Atidaryti žymeklį--
Atidarykite my_cursor
--Start Loop žymeklio kintamieji--
Atnešti kitą iš my_cursor į @hid
o @@FETCH_STATUS = 0 -- grąžina paskutinio žymeklio, kurį vykdo FETCH sakinys, būseną --
PRADĖTI      
    -- Pagal viešbučio ID nustatoma pasikartojančios datos kaina
    IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_room') ir type='U')
    PRADĖTI
        Išmeskite lentelę ##temp_room
    PABAIGA

    -- Viešbučiai pagal datą, su kambariais surūšiuoti pagal datą Kaina
    SELECT info_id, [date], price, remain room_id Į ##temp_room FROM dbo.room_info KUR @sdate <= [date] ir [date] <= @edate IR LIEKA > 0 IR room_id (PASIRINKITE rt.room_id IŠ dbo.room_type rt KUR rt.hotel_id=@hid) UŽSAKYMAS PAGAL [data] ASC, kaina ASC
   
   
    DEKLARUOTI @thisrdate DATĄ = NULINĘ; -- Data
    DEKLARUOTI @thisrnum INT=0; -- Dabartinę dieną pasirinktų kambarių skaičius
   
    DEKLARUOTI @rdate DATĄ = NULINĘ; -- Data
    DEKLARUOTI @rmnum INT = 0; -- Kambarių skaičius pagal kambario tipą
   
    -- Ciklas pagal datą
    PASKELBTI @my_cursor2 ŽYMEKLĮ;
    nustatyti @my_cursor2 = ŽYMEKLIS PASIRINKTI info_id IŠ ##temp_room UŽSAKYTI PAGAL [data] ASC, kaina ASC
    ATVIRAS @my_cursor2;
    GAUTI KITĄ IŠ @my_cursor2 Į @infoid
    WHILE(@@FETCH_STATUS=0)
    PRADĖTI
        --##temp_result
        SELECT @rmnum=remain, @rdate=[date] FROM ##temp_room WHERE info_id=@infoid
        JEI (@thisrdate YRA NULINIS ARBA @thisrdate != @rdate)
        PRADĖTI
            SPAUSDINTI @rdate
            NUSTATYTI @thisrdate = @rdate;
            SET @thisrnum = 0;
        PABAIGA
        -- Dozavimo formos parinkimas kambario tipas
        IF(@thisrnum <= @roomnum)
        PRADĖTI
            IF (@thisrnum + @rmnum > @roomnum)
            PRADĖTI
                -- Kambarių skaičius, kurį reikia naudoti
                SET @rmnum = @roomnum-@thisrnum;
            PABAIGA
        PABAIGA
        KITAIP   
        PRADĖTI
            -- Šiai datai nereikia vietos
            NUSTATYTI @rmnum = 0;
        PABAIGA
        
        JEI (@rmnum > 0)
        PRADĖTI
            -- Pridėti rezultatus pagal nurodytą skaičių
            ĮTERPTI Į ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric)
            PASIRINKITE @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0, 0 NUO ##temp_room KUR info_id = @infoid
            
            -- Kambarių skaičius pasiekė apskaičiuotą vidutinę kainą
            NUSTATYTI @thisrnum = @thisrnum + @rmnum;
            IF (@thisrnum = @roomnum)
            PRADĖTI
                -- Bendra kaina pagal viešbutį, skaičiuojama pagal datas
                UPDATE ##temp_result SET dsumprice=(SELECT SUM(room_num*roomprice) FROM ##temp_result tr WHERE tr.hotel_id=@hid AND tr.[ data]=@thisrdate) KUR hotel_id=@hid IR [data]=@thisrdate
                -- Apskaičiuokite vidutinę kambario kainą pagal viešbutį, bendrą kainą pagal datą
                UPDATE ##temp_result SET davgprice=(dsumprice/@roomnum) KUR hotel_id=@hid IR [data]=@thisrdate
            PABAIGA
        PABAIGA

        ATNEŠTI KITĄ IŠ @my_cursor2 Į @infoid;
    PABAIGA   
    uždaryti @my_cursor2;  --Išjunkite žymeklį
    perskirstyti @my_cursor2;   --atleiskite žymeklį

    -- Pagal viešbutį, apskaičiuokite bendrą viešbučio kainą
    ATNAUJINTI ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) FROM ##temp_result tr WHERE tr.hotel_id=@hid) WHERE hotel_id=@hid
    -- Apskaičiuokite vidutinę dienos kainą už visą kambarį viešbutyje
    ATNAUJINKITE ##temp_result NUSTATYKITE sumavgpric=(sumpric/@roomnum/@days) KUR hotel_id=@hid

    ATNEŠTI TOLIAU iš my_cursor į @hid - pereiti prie kito žymeklio, jokių aklavietės
PABAIGA  
uždaryti my_cursor -- uždaryti žymeklį
Išskirkite my_cursor - atleiskite žymeklį


-- Pridėkite viešbučio pavadinimą ir kambario tipo pavadinimą prie laikinos lentelės
ATNAUJINKITE ##temp_result NUSTATYKITE hotel_name=(PASIRINKITE ht.hotel_name IŠ dbo.hotel ht KUR ht.hotel_id=##temp_result.hotel_id),
room_name=(PASIRINKITE rt.room_name IŠ dbo.room_type rt KUR rt.room_id=##temp_result.room_id)


-- Patikrinkite rezultatus iš rezultatų lentelės
PASIRINKITE * IŠ ##temp_result




-- Baigti laikinų lentelių valymą
IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_hotel') ir type='U')
PRADĖTI
    Išmeskite lentelę ##temp_hotel
PABAIGA
IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_room') ir type='U')
PRADĖTI
    Išmeskite lentelę ##temp_room
PABAIGA
IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_result') ir type='U')
PRADĖTI
    Išmeskite lentelę ##temp_result
PABAIGA

Vertinimas pagal

Dalyvių skaičius1MB+1 Prisidėti prie+1 Žlugimo priežastis
Admin + 1 + 1 Entuziastingai padėti kitiems!

Peržiūrėti visus įvertinimus

 Savininkas| Paskelbta 2018-12-06 14:11:48 |
xzxmustwin Publikuota: 2018-12-6 11:58
Tiesą sakant, šios lentelės struktūra yra šiek tiek nepagrįsta

Namų darbų klausimai, kuriuos priskiria emmmm duomenų bazės mokytojas, iš tiesų gali būti nepagrįsti, ir aš nemačiau, jei aš neišmokau labai gerai ...
Tačiau svarbiausia vis tiek yra problemų sprendimo idėjos, noriu paklausti savo draugų, ar turite kokių nors pasiūlymų?
 Savininkas| Paskelbta 2018-12-06 14:09:20 |
LZZSF Publikuota 2018-12-6 09:07
MySQL yra pasenęs, nėra kliento, duokite man scenarijų SQL Server

Atsiprašome, aš nenaudojau SQL Sever dar, galbūt todėl, kad tai tik mokymas, todėl mokytojas paprašė mūsų naudoti mysql tai padaryti. Jei jūsų draugai nori pasidalinti savo idėjomis, labai ačiū.
Paskelbta 2018-12-05 21:57:13 |
Aš eisiu į QQ grupę pasiūlyti atlygį 10 juanių pamatyti, jei kas nors gali padėti jums atsakyti ne
Paskelbta 2018-12-06 07:56:39 |
Pagalba
Paskelbta 2018-12-06 09:07:08 |
MySQL yra pasenęs, nėra kliento, duokite man scenarijų SQL Server

Vertinimas pagal

Dalyvių skaičius1MB+1 Prisidėti prie+1 Žlugimo priežastis
Admin + 1 + 1 Entuziastingas!

Peržiūrėti visus įvertinimus

Paskelbta 2018-12-06 11:24:25 |
LZZSF Publikuota 2018-12-6 09:07
MySQL yra pasenęs, nėra kliento, duokite man scenarijų SQL Server

Rekomenduojama kalbėti apie idėją ir leisti nuomotojui ją naudoti kaip nuorodą, o tai taip pat turėtų būti įmanoma
Paskelbta 2018-12-06 11:58:37 |
Tiesą sakant, šios lentelės struktūra yra šiek tiek nepagrįsta

Vertinimas pagal

Dalyvių skaičius1MB+1 Prisidėti prie+1 Žlugimo priežastis
Admin + 1 + 1 Entuziastingas!

Peržiūrėti visus įvertinimus

 Savininkas| Paskelbta 2018-12-06 14:07:29 |
Publikuota 2018-12-5 21:57
Aš eisiu į QQ grupę pasiūlyti atlygį 10 juanių pamatyti, jei kas nors gali padėti jums atsakyti ne

Ačiū, jei kas nori atsakyti, atsiųsiu jums raudoną voką :)
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com