Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 23250|Antwoord: 11

[Nieuw Nummer] Hoe kies je de goedkoopste n kamers

[Link kopiëren]
Geplaatst op 05-12-2018 21:32:38 | | | |
Nu zijn er twee tafels om te gebruiken, room_type en room_info
Er zijn 3 hotels met ID's 1~3. Dan heeft elk hotel 3 kamertypes, met respectievelijk ID's van 1~9.
De room_type bevat de naam, ID en de bijbehorende hotel-ID van elk kamertype
Wat in de room_info wordt opgeslagen, is de prijs van elke dag, elk kamertype en het aantal overgebleven kamers.
De onderwerpen die ik graag wil stellen zijn:
Geef de tijdsperiode en het aantal te boeken kamers op, vraag naar de hotels, kamertypes en hun gemiddelde prijzen die aan de voorwaarden voldoen (tijd, aantal kamers die nog zijn), en sorteer deze op gemiddelde prijs van laagst naar hoog. De resultaten omvatten hotels, geselecteerde kamercombinaties en hoeveelheden, en de laagste gemiddelde prijs.
##不要求为同一房型, maar het moet hetzelfde hotel zijn, en je kunt het kamertype halverwege veranderen.
##比如, de inchecktijd is 2018-11-14~2018-11-15, en het aantal geboekte kamers is 5
##返回选择酒店A, 11-14 selecteer 4 kamertypes met ID 3, 1 kamertype met ID 2, 11-15 selecteer 3 kamertypes met ID 3, 2 kamertypes met ID 2, en de laagste prijs is 2000
##老师要求只能用sql语句, MySQL-implementatie kan geen Python, C++, enzovoort gebruiken
Ik heb het een dag niet opgeschreven, en ik zag geen soortgelijk onderwerp op internet, dus kwam ik de goden om hulp vragen, en ik wil je vragen hoe je dat kunt bereiken, dank je~







Vorig:PHP-programmaapen's zelfgerapporteerde ervaringsdeling
Volgend:2019 postgraduaat-toelatingsexamen politiek Xu Tao en Xiao Xiurong's sprintmateriaal
Geplaatst op 06-12-2018 17:00:58 |
Dit bericht is voor het laatst bewerkt door Miaolinsen op 6-12-2018 om 17:03

Ik heb het niet met MySQL gedaan, ik heb het met mssql gedaan:


/*
Geef de tijdsperiode en het aantal te boeken kamers op, vraag naar de hotels, kamertypes en hun gemiddelde prijzen die aan de voorwaarden voldoen (tijd, aantal kamers die nog zijn), en sorteer deze op gemiddelde prijs van laagst naar hoog. De resultaten omvatten hotels, geselecteerde kamercombinaties en hoeveelheden, en de laagste gemiddelde prijs.
##不要求为同一房型, maar het moet hetzelfde hotel zijn, en je kunt het kamertype halverwege veranderen. -- Parsing: Dit betekent dat het kamertype niet hoeft te overwegen, alleen het aantal kamers wordt meegenomen
##比如, selecteer het inchecktijdstip 2018-11-14~2018-11-15, en het aantal geboekte kamers is 5 -- Analyse: Het hotel moet binnen de datumsperiode vallen en er is vraag naar het aantal kamers per dag (als er op een bepaalde dag niemand is, voldoet het niet aan de standaard)
##返回选择酒店A, 11-14 selecteer 4 kamertypes met ID 3, 1 kamertype met ID 2, 11-15 selecteer 3 kamertypen met ID 3, 2 kamertypen met ID 2, en de laagste prijs is 2000 -- Analyse: Bereken de gemiddelde prijs volgens de minimale configuratie per dag
##老师要求只能用sql语句, MySQL-implementatie, kan geen Python, C++, enz. gebruiken. */


-- Binnenkomende parameters, datum, bereik, aantal benodigde kamers
VERKLAAR @sdate DATUM = '2018-11-14';
VERKLAAR @edate DATUM = '2018-11-15';
DECLARE @roomnum INT = 5;


-- Bereken het aantal dagen verblijf
VERKLAAR @days INT;
SET @days = DATEDIFF(DAG, @sdate, @edate)+1;

-- Hotelnummer dat binnen de datumperiode valt, aantal kamers
IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_hotel') en type='U')
BEGIN
    Droptafel ##temp_hotel
EINDE

SELECTEER ta.hotel_id in ##temp_hotel VAN
(SELECT ri. [datum], rt.hotel_id, SUM(ri.remain) room_num VAN room_info ri LINKS SLUIT room_type rt aan op ri.room_id=rt.room_id waarbij @sdate <= [datum] en [datum] <= @edate GROEP DOOR ri. [datum],rt.hotel_id DIE SUM(remain) >= 5) ta heeft
GROEPEREN MET ta.hotel_id HEBBEN TELLEN(*) = @days



-- Berekend volgens het hotel (configureer het minimale kamertype per dag)

IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_result') en type='U')
BEGIN
    Droptafel ##temp_result
EINDE
-- Voorlopige Tabel van Resultaten Hoteldatum Kamertype ID Kamertype Naam Aantal kamers Kamerprijs Hotel Dagelijks totaal hotel Gemiddelde hotelprijs Hotel Totale hotelprijs Hotel Totaal Dagelijkse gemiddelde prijs van hotel Totale dagelijkse kamerprijs
MAAK TABEL ##temp_result(
    hotel_id INT,
    hotel_name varchar(255),
    [datum] DATUM,
    room_id INT,
    room_name VARCHAR(255),
    room_num INT,
    kamerprijs DECIMAAL,
    dsumprice DECIMAAL,
    davgprice DECIMAAL,
    Sumprische DECIMAAL,
    sumavgpric DECIMAAL
)

VERKLAAR @hid INT; -- Hotel-ID
VERKLAAR @infoid INT; -- info-id
--bevestig dat de cursor een verzameling is
DECLARE my_cursor cursor voor (SELECT hotel_id uit ##temp_hotel);
--Open cursor--
Open my_cursor
--Start-luscursorvariabelen--
haal de volgende van my_cursor naar @hid
terwijl @@FETCH_STATUS = 0 -- de toestand teruggeeft van de laatste cursor uitgevoerd door de FETCH-instructie --
BEGIN      
    -- Op basis van de hotel-ID wordt de terugkerende datum geprijsd
    IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_room') en type='U')
    BEGIN
        Droptafel ##temp_room
    EINDE

    -- Hotels, op datum, met kamers gesorteerd op datum Tarief
    SELECTEER info_id, [datum], prijs, rest, room_id IN ##temp_room UIT dbo.room_info WAARBIJ @sdate <= [datum] en [datum] <= @edate EN blijft > 0 EN room_id IN (SELECTEER rt.room_id UIT dbo.room_type rt WAAR rt.hotel_id=@hid) BESTEL OP [DATUM] ASC, PRIJS ASC
   
   
    VERKLAAR @thisrdate DATUM = NUL; -- Date
    VERKLAAR @thisrnum INT=0; -- Aantal kamers geselecteerd op de huidige datum
   
    VERKLAAR @rdate DATUM = NULL; -- Date
    DECLARE @rmnum INT = 0; -- Aantal kamers per kamertype
   
    -- Cyclus op datum
    VERKLAAR @my_cursor2 CURSOR;
    stel @my_cursor2 = CURSOR VOOR SELECT info_id UIT ##temp_room BESTEL OP [DATUM] ASC, PRIJS ASC
    OPEN @my_cursor2;
    HAAL DE VOLGENDE VAN @my_cursor2 NAAR @infoid
    WHILE(@@FETCH_STATUS=0)
    BEGIN
        --##temp_result
        SELECTEER @rmnum=blijven, @rdate=[datum] VANAF ##temp_room WAAR info_id=@infoid
        ALS (@thisrdate NULL IS OF @thisrdate != @rdate)
        BEGIN
            PRINT @rdate
            SET @thisrdate = @rdate;
            SET @thisrnum = 0;
        EINDE
        -- Type doseringsformulierselectie
        IF(@thisrnum <= @roomnum)
        BEGIN
            ALS (@thisrnum + @rmnum > @roomnum)
            BEGIN
                -- Het aantal kamers dat je moet gebruiken
                STEL @rmnum = @roomnum-@thisrnum;
            EINDE
        EINDE
        ANDERS   
        BEGIN
            -- Er is geen kamer nodig voor die datum
            SET @rmnum = 0;
        EINDE
        
        ALS (@rmnum > 0)
        BEGIN
            -- Resultaten optellen op opgegeven aantal
            VUL IN ##temp_result(hotel_id, hotel_name, [datum], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric)
            SELECTEER @hid, '', @thisrdate, room_id, '', @rmnum, prijs, 0, 0, 0, 0 UIT ##temp_room WAARBIJ info_id = @infoid
            
            -- Het aantal kamers heeft de berekende gemiddelde prijs bereikt
            STEL @thisrnum = @thisrnum + @rmnum;
            ALS (@thisrnum = @roomnum)
            BEGIN
                -- Totale prijs per hotel, berekend voor data
                UPDATE ##temp_result STEL dsumprice=(SELECTEER SUM(room_num*roomprice) VAN ##temp_result tr WAAR tr.hotel_id=@hid EN tr.[ datum]=@thisrdate) WAARBIJ hotel_id=@hid EN [datum]=@thisrdate
                -- Bereken de gemiddelde kamerprijs per hotel, totale prijs per datum
                UPDATE ##temp_result STEL davgprice=(dsumprice/@roomnum) WAAR hotel_id=@hid EN [date]=@thisrdate
            EINDE
        EINDE

        HAAL VERVOLGENS VAN @my_cursor2 NAAR @infoid;
    EINDE   
    dichtbij @my_cursor2;  --Zet de cursor uit
    Dealloc-@my_cursor2;   --loslaatcursor

    -- Per hotel, bereken de totale hotelprijs
    UPDATE ##temp_result SET sumpric=(SELECTEER SUM(room_num*roomprice) VAN ##temp_result tr WAAR tr.hotel_id=@hid) WAAR hotel_id=@hid
    -- Bereken de gemiddelde dagprijs van de totale kamer in het hotel
    UPDATE ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) WAAR hotel_id=@hid

    FETCH vervolgens van my_cursor naar @hid - ga naar de volgende cursor, geen deadloops
EINDE  
sluit my_cursor -- sluit de cursor
Loslaten my_cursor - laat de cursor los


-- Voeg de hotelnaam en kamertype toe aan de tijdelijke tabel
UPDATE ##temp_result SET hotel_name=(SELECTEER ht.hotel_name VAN dbo.hotel ht WAAR ht.hotel_id=##temp_result.hotel_id),
room_name=(SELECTEER rt.room_name UIT dbo.room_type rt WAAR rt.room_id=##temp_result.room_id)


-- Controleer de resultaten in de resultaattabel
SELECTEER * UIT ##temp_result




-- Tijdelijke tabellen beëindigen
IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_hotel') en type='U')
BEGIN
    Droptafel ##temp_hotel
EINDE
IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_room') en type='U')
BEGIN
    Droptafel ##temp_room
EINDE
IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_result') en type='U')
BEGIN
    Droptafel ##temp_result
EINDE

Partituur

Aantal deelnemers1MB+1 bijdragen+1 Instorting reden
admin + 1 + 1 Enthousiast om anderen te helpen!

Bekijk alle beoordelingen

 Huisbaas| Geplaatst op 06-12-2018 14:11:48 |
xzxmustwin Geplaatst op 6-12-2018 11:58
Om eerlijk te zijn is de structuur van deze tabel wat onredelijk

De huiswerkvragen die de emmmm-databaseleraar geeft, zijn misschien inderdaad onredelijk, en ik zag het niet als ik het niet heel goed had geleerd...
Maar de sleutel blijft de probleemoplossende ideeën, ik wil mijn vrienden vragen of jullie suggesties hebben?
 Huisbaas| Geplaatst op 06-12-2018 14:09:20 |
LZZSF geplaatst op 2018-12-6 09:07
MySQL is verouderd, geen client, geef me het script voor SQL Server

Sorry, ik heb SQL Sever nog niet gebruikt, misschien omdat het gewoon lesgeven, dus vroeg de docent ons om MySQL te gebruiken om het te doen. Als je vrienden bereid zijn hun ideeën te delen, heel erg bedankt.
Geplaatst op 05-12-2018 21:57:13 |
Ik ga naar de QQ-groep om een beloning van 10 yuan aan te bieden om te zien of iemand je kan helpen nee te antwoorden
Geplaatst op 06-12-2018 07:56:39 |
Help
Geplaatst op 06-12-2018 09:07:08 |
MySQL is verouderd, geen client, geef me het script voor SQL Server

Partituur

Aantal deelnemers1MB+1 bijdragen+1 Instorting reden
admin + 1 + 1 Enthousiast!

Bekijk alle beoordelingen

Geplaatst op 06-12-2018 11:24:25 |
LZZSF geplaatst op 2018-12-6 09:07
MySQL is verouderd, geen client, geef me het script voor SQL Server

Het wordt aanbevolen om het idee te bespreken en de verhuurder het als referentie te laten gebruiken, wat ook mogelijk zou moeten zijn
Geplaatst op 06-12-2018 11:58:37 |
Om eerlijk te zijn is de structuur van deze tabel wat onredelijk

Partituur

Aantal deelnemers1MB+1 bijdragen+1 Instorting reden
admin + 1 + 1 Enthousiast!

Bekijk alle beoordelingen

 Huisbaas| Geplaatst op 06-12-2018 14:07:29 |
Gepubliceerd op 2018-12-5 21:57
Ik ga naar de QQ-groep om een beloning van 10 yuan aan te bieden om te zien of iemand je kan helpen nee te antwoorden

Bedankt, als iemand wil antwoorden, stuur ik je de rode envelop :)
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com