Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 23250|Svar: 11

[Nytt nummer] Hur man väljer de billigaste n rummen

[Kopiera länk]
Publicerad på 2018-12-05 21:32:38 | | | |
Nu finns det två tabeller att använda, room_type och room_info
Det finns 3 hotell med ID 1~3. Sedan har varje hotell 3 rumstyper, med ID:n 1~9 respektive.
room_type innehåller namn, ID och motsvarande hotell-ID för varje rumstyp
Det som lagras i room_info är priset för varje dag, varje rumstyp och antalet rum som återstår.
De ämnen jag vill ställa är:
Ange tidsintervall och antal rum som ska bokas, fråga efter hotell, rumstyper och deras genomsnittliga priser som uppfyller villkoren (tid, antal rum kvar), och sortera dem efter genomsnittspris från lägst till högst. Resultaten inkluderar hotell, utvalda rumskombinationer och kvantiteter samt det lägsta genomsnittspriset.
##不要求为同一房型, men det måste vara samma hotell, och du kan ändra rumstyp halvvägs.
##比如, incheckningstiden är 2018-11-14~2018-11-15, och antalet bokade rum är 5
##返回选择酒店A, 11-14 välj 4 rumstyper med ID 3, 1 rumstyp med ID 2, 11-15 välj 3 rumstyper med ID 3, 2 rumstyper med ID 2, och det lägsta priset är 2000
##老师要求只能用sql语句, MySQL-implementeringen kan inte använda Python, C++, etc
Jag skrev inte ner det på en dag, och jag såg inget liknande ämne på internet, så jag kom för att be gudarna om hjälp, och jag vill fråga dig hur du kan uppnå det, tack~







Föregående:PHP-programmets självrapporterade erfarenhetsdelning
Nästa:2019 års postgraduatinträdesprov politik Xu Tao och Xiao Xiurongs sprintmaterial
Publicerad på 2018-12-06 17:00:58 |
Detta inlägg redigerades senast av Miaolinsen den 6-12-2018 kl. 17:03

Jag gjorde det inte med MySQL, jag gjorde det med mssql:


/*
Ange tidsintervall och antal rum som ska bokas, fråga efter hotell, rumstyper och deras genomsnittliga priser som uppfyller villkoren (tid, antal rum kvar), och sortera dem efter genomsnittspris från lägst till högst. Resultaten inkluderar hotell, utvalda rumskombinationer och kvantiteter samt det lägsta genomsnittspriset.
##不要求为同一房型, men det måste vara samma hotell, och du kan ändra rumstyp halvvägs. -- Parsing: Det betyder att det inte finns något behov av att ta hänsyn till rumstypen, endast antalet rum räknas
##比如, välj incheckningstiden 2018-11-14~2018-11-15, och antalet bokade rum är 5 -- Analys: Hotellet måste ligga inom datumintervallet, och det finns en efterfrågan på antalet rum varje dag (om det inte finns någon en viss dag kommer det inte att uppfylla standarden)
##返回选择酒店A, 11-14 välj 4 rumstyper med ID 3, 1 rumstyp med ID 2, 11-15 välj 3 rumstyper med ID 3, 2 rumstyper med ID 2, och lägsta priset är 2000 -- Analys: Beräkna genomsnittspriset enligt minsta konfiguration per dag
##老师要求只能用sql语句, MySQL-implementation, kan inte använda Python, C++, etc. */


-- Inkommande parametrar, datumintervall, antal rum som krävs
DEKLARERA @sdate DATUM = '2018-11-14';
DEKLARERA @edate DATUM = '2018-11-15';
DEKLARERA @roomnum INT = 5;


-- Beräkna antalet dagar av vistelse
DEKLAR @days INT;
SET @days = DATEDIFF(DAY, @sdate, @edate)+1;

-- Hotellnummer som uppfyller datumintervallet, antal rum
IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_hotel') och typ='U')
BÖRJA
    Släppbord ##temp_hotel
SLUT

VÄLJ ta.hotel_id i ##temp_hotel FRÅN
(VÄLJ ri. [datum], rt.hotel_id, SUM(ri.remain) room_num FRÅN room_info ri VÄNSTER ANSLUTA room_type rt på ri.room_id=rt.room_id där @sdate <= [datum] och [datum] <= @edate GRUPP EFTER ri. [datum],rt.hotel_id SOM HAR SUMMA(ÅTERSTÅENDE) >= 5) ta
GRUPPERA EFTER ta.hotel_id HA RÄKNING(*) = @days



-- Beräknat enligt hotellet (konfigurera minsta rumstyp per dag)

IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_result') och skriv='U')
BÖRJA
    Släppbord ##temp_result
SLUT
-- Preliminär resultattabell Hotelldatum Rumstyp ID Rumstyp Namn Antal rum Hotell Dagligt totalt hotell Dagligt genomsnittligt hotellpris Hotell totalt hotellpris Totalt Dagligt genomsnittspris på hotell Totalt dagligt genomsnittspris på hotell Totalt dagligt rumspris
SKAPA TABELL ##temp_result(
    hotel_id INT,
    hotel_name varchar(255),
    [datum] DATUM,
    room_id INT,
    room_name VARCHAR (255),
    room_num INT,
    rumspris DECIMAL,
    dsumpris DECIMAL,
    davgprice DECIMAL,
    SUMPRISK DECIMAL,
    SUMAVGPRIC DECIMAL
)

DEKLARERA @hid INT; -- Hotell-ID
DEKLARERA @infoid INT; -- info-id
--bekräfta att markören är en samling
DEKLARERA my_cursor markör för (SELECT hotel_id från ##temp_hotel);
--Öppna markören--
öppna my_cursor
--Startloop-markörvariabler--
hämta nästa från my_cursor till @hid
medan @@FETCH_STATUS = 0 -- returnerar tillståndet för den senaste markören som utfördes av FETCH-satsen --
BÖRJA      
    -- Baserat på hotell-ID är det återkommande datumet prissatt
    IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_room') och typ='U')
    BÖRJA
        Släppbord ##temp_room
    SLUT

    -- Hotell, efter datum, med rum sorterade efter datum Pris
    VÄLJ info_id, [datum], pris, rest, room_id IN I ##temp_room FRÅN dbo.room_info DÄR @sdate <= [datum] och [datum] <= @edate OCH FÖRBLI > 0 OCH room_id I (VÄLJ rt.room_id FRÅN dbo.room_type rt DÄR rt.hotel_id=@hid) ORDNA EFTER [datum] ASC, pris ASC
   
   
    DEKLARERA @thisrdate DATUM = NULL; -- Datum
    DEKLARERA @thisrnum INT=0; -- Antal rum valda på det aktuella datumet
   
    DEKLARERA @rdate DATUM = NULL; -- Datum
    DEKLARERA @rmnum INT = 0; -- Antal rum efter rumstyp
   
    -- Cykel efter datum
    DEKLAR @my_cursor2 MARKÖR;
    Ställ @my_cursor2 = MARKÖR FÖR ATT VÄLJA info_id FRÅN ##temp_room ORDNA EFTER [datum] ASC, pris ASC
    ÖPPNA @my_cursor2;
    HÄMTA NÄSTA FRÅN @my_cursor2 TILL @infoid
    WHILE(@@FETCH_STATUS=0)
    BÖRJA
        --##temp_result
        VÄLJ @rmnum=förbli, @rdate=[datum] FRÅN ##temp_room DÄR info_id=@infoid
        OM (@thisrdate ÄR NULL ELLER @thisrdate != @rdate)
        BÖRJA
            TRYCK @rdate
            SET @thisrdate = @rdate;
            SET @thisrnum = 0;
        SLUT
        -- Typ av doseringsformulär i rummet
        IF(@thisrnum <= @roomnum)
        BÖRJA
            OM (@thisrnum + @rmnum > @roomnum)
            BÖRJA
                -- Antalet rum du behöver använda
                SET @rmnum = @roomnum-@thisrnum;
            SLUT
        SLUT
        ANNARS   
        BÖRJA
            -- Inget rum behövs för det datumet
            SET @rmnum = 0;
        SLUT
        
        OM (@rmnum > 0)
        BÖRJA
            -- Lägg till resultat med angivet antal
            INFOGA I ##temp_result(hotel_id, hotel_name, [datum], room_id, room_name, room_num, rumpris, dsumprice, davgprice, sumpric, sumavgpric)
            VÄLJ @hid, '', @thisrdate, room_id, '', @rmnum, pris, 0, 0, 0, 0 FRÅN ##temp_room DÄR info_id = @infoid
            
            -- Antalet rum har nått det beräknade genomsnittspriset
            SET @thisrnum = @thisrnum + @rmnum;
            OM (@thisrnum = @roomnum)
            BÖRJA
                -- Totalpris per hotell, beräknat för datum
                UPPDATERING ##temp_result SÄTT dsumprice=(VÄLJ SUM(room_num*roomprice) FRÅN ##temp_result tr DÄR tr.hotel_id=@hid OCH tr.[ datum]=@thisrdate) DÄR hotel_id=@hid OCH [datum]=@thisrdate
                -- Beräkna genomsnittligt rumspris per hotell, totalt pris per datum
                UPPDATERING ##temp_result SÄTT davgprice=(dsumprice/@roomnum) DÄR hotel_id=@hid OCH [datum]=@thisrdate
            SLUT
        SLUT

        HÄMTA NÄSTA FRÅN @my_cursor2 TILL @infoid;
    SLUT   
    Nära @my_cursor2;  --Stäng av markören
    Dela ut @my_cursor2;   --frigivningsmarkör

    -- Per hotell, beräkna det totala hotellpriset
    UPPDATERING ##temp_result SÄTT sumpric=(VÄLJ SUM(room_num*roomprice) FRÅN ##temp_result tr DÄR tr.hotel_id=@hid) DÄR hotel_id=@hid
    -- Beräkna det genomsnittliga dagliga priset för det totala rummet på hotellet
    UPPDATERING ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) DÄR hotel_id=@hid

    HÄMTA nästa från my_cursor till @hid – gå till nästa markör, inga deadloops
SLUT  
Stäng my_cursor – stäng markören
Dela plats my_cursor – släpp markören


-- Lägg till hotellnamnet och rumstypsnamnet i den tillfälliga tabellen
UPPDATERING ##temp_result STÄLL hotel_name=(VÄLJ ht.hotel_name FRÅN dbo.hotel ht DÄR ht.hotel_id=##temp_result.hotel_id),
room_name=(VÄLJ rt.room_name FRÅN dbo.room_type RT DÄR rt.room_id=##temp_result.room_id)


-- Kontrollera resultaten från resultattabellen
VÄLJ * FRÅN ##temp_result




-- Avsluta rensningen av tillfälliga tabeller
IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_hotel') och typ='U')
BÖRJA
    Släppbord ##temp_hotel
SLUT
IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_room') och typ='U')
BÖRJA
    Släppbord ##temp_room
SLUT
IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_result') och skriv='U')
BÖRJA
    Släppbord ##temp_result
SLUT

Tjog

Antal deltagare1MB+1 bidra+1 Kollaps förnuft
Admin + 1 + 1 Entusiastisk över att hjälpa andra!

Se alla betyg

 Hyresvärd| Publicerad på 2018-12-06 14:11:48 |
xzxmustwin Publicerad den 2018-12-6 11:58
Ärligt talat är strukturen på den här tabellen lite orimlig

Läxorna som emmmm-databasläraren ger kan faktiskt vara orimliga, och jag såg dem inte om jag inte lärde mig dem särskilt bra...
Men nyckeln är fortfarande problemlösningsidéerna, jag vill fråga mina vänner om ni har några förslag?
 Hyresvärd| Publicerad på 2018-12-06 14:09:20 |
LZZSF publicerade den 2018-12-6 09:07
MySQL är föråldrat, ingen klient, ge mig skriptet för SQL Server

Förlåt, jag har inte använt SQL Sever än, kanske för att det bara är undervisning, så läraren bad oss använda MySQL för att göra det. Om dina vänner är villiga att dela med sig av sina idéer, tack så mycket.
Publicerad på 2018-12-05 21:57:13 |
Jag går till QQ-gruppen och erbjuder en belöning på 10 yuan för att se om någon kan hjälpa dig svara nej
Publicerad på 2018-12-06 07:56:39 |
Hjälp
Publicerad på 2018-12-06 09:07:08 |
MySQL är föråldrat, ingen klient, ge mig skriptet för SQL Server

Tjog

Antal deltagare1MB+1 bidra+1 Kollaps förnuft
Admin + 1 + 1 Entusiastiskt!

Se alla betyg

Publicerad på 2018-12-06 11:24:25 |
LZZSF publicerade den 2018-12-6 09:07
MySQL är föråldrat, ingen klient, ge mig skriptet för SQL Server

Det rekommenderas att prata om idén och låta hyresvärden använda den som referens, vilket också borde vara möjligt
Publicerad på 2018-12-06 11:58:37 |
Ärligt talat är strukturen på den här tabellen lite orimlig

Tjog

Antal deltagare1MB+1 bidra+1 Kollaps förnuft
Admin + 1 + 1 Entusiastiskt!

Se alla betyg

 Hyresvärd| Publicerad på 2018-12-06 14:07:29 |
Publicerad den 2018-12-5 21:57
Jag går till QQ-gruppen och erbjuder en belöning på 10 yuan för att se om någon kan hjälpa dig svara nej

Tack, om någon är villig att svara skickar jag det röda kuvertet till dig :)
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com