Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 23250|Antwort: 11

[Neue Ausgabe] Wie man die günstigsten n Zimmer auswählt

[Link kopieren]
Veröffentlicht am 05.12.2018 21:32:38 | | | |
Jetzt gibt es zwei Tische, room_type und room_info
Es gibt 3 Hotels mit Ausweisen 1~3. Jedes Hotel hat dann 3 Zimmertypen mit IDs von 1~9 jeweils.
Die room_type enthält den Namen, die ID und die entsprechende Hotel-ID jedes Zimmertyps
Was im room_info gelagert wird, ist der Preis jedes Tages, jeder Zimmertyp und die Anzahl der verbleibenden Zimmer.
Die Themen, die ich fragen möchte, sind:
Geben Sie den Zeitraum und die Anzahl der zu buchenden Zimmer an, fragen Sie die Hotels, Zimmertypen und deren Durchschnittspreise ab, die den Bedingungen entsprechen (Zeit, Anzahl der verbleibenden Zimmer), und sortieren Sie sie nach Durchschnittspreis von niedrig bis höchst. Die Ergebnisse umfassen Hotels, ausgewählte Zimmerkombinationen und -mengen sowie den niedrigsten Durchschnittspreis.
##不要求为同一房型, aber es muss dasselbe Hotel sein, und du kannst den Zimmertyp mittendrin ändern.
##比如, die Check-in-Zeit ist 2018-11-14~2018-11-15, und die Anzahl der gebuchten Zimmer beträgt 5
##返回选择酒店A, 11-14 wählen Sie 4 Zimmertypen mit ID 3, 1 Zimmertyp mit ID 2, 11-15 wählen Sie 3 Zimmertypen mit ID 3, 2 Zimmertypen mit ID 2, und der niedrigste Preis ist 2000
##老师要求只能用sql语句, MySQL-Implementierung kann Python, C++ usw. nicht verwenden
Ich habe es einen Tag lang nicht aufgeschrieben und kein ähnliches Thema im Internet gesehen, also bin ich gekommen, um die Götter um Hilfe zu bitten, und ich möchte euch fragen, wie man das erreicht, danke~







Vorhergehend:PHP-Programm-Ape's selbstberichtete Erfahrungsaustausch
Nächster:Postgraduierten-Aufnahmeprüfung 2019 Politik Xu Tao und Xiao Xiurongs Sprint-Materialien
Veröffentlicht am 06.12.2018 17:00:58 |
Dieser Beitrag wurde zuletzt von Miaolinsen am 6.12.2018 um 17:03 Uhr bearbeitet

Ich habe es nicht mit MySQL gemacht, sondern mit mssql:


/*
Geben Sie den Zeitraum und die Anzahl der zu buchenden Zimmer an, fragen Sie die Hotels, Zimmertypen und deren Durchschnittspreise ab, die den Bedingungen entsprechen (Zeit, Anzahl der verbleibenden Zimmer), und sortieren Sie sie nach Durchschnittspreis von niedrig bis höchst. Die Ergebnisse umfassen Hotels, ausgewählte Zimmerkombinationen und -mengen sowie den niedrigsten Durchschnittspreis.
##不要求为同一房型, aber es muss dasselbe Hotel sein, und du kannst den Zimmertyp mittendrin ändern. -- Parsing: Das bedeutet, dass der Raumtyp nicht berücksichtigt werden muss, sondern nur die Anzahl der Räume berücksichtigt wird
##比如, wählen Sie die Check-in-Zeit 2018-11-14~2018-11-15, und die Anzahl der gebuchten Zimmer beträgt 5 -- Analyse: Das Hotel muss im Datumsbereich liegen, und es gibt täglich eine Nachfrage nach der Anzahl der Zimmer (wenn an einem bestimmten Tag niemand da ist, erfüllt es den Standard nicht)
##返回选择酒店A, 11-14 wählen Sie 4 Zimmertypen mit ID 3, 1 Zimmertyp mit ID 2, 11-15 wählen Sie 3 Zimmertypen mit ID 3, 2 Zimmertypen mit ID 2, und der niedrigste Preis ist 2000 – Analyse: Berechnen Sie den Durchschnittspreis entsprechend der Mindestkonfiguration pro Tag
##老师要求只能用sql语句, MySQL-Implementierung, kann Python, C++ usw. nicht verwenden. */


-- Eingehende Parameter, Datumsbereich, Anzahl der benötigten Zimmer
GIB @sdate DATUM AN = '2018-11-14';
GEBEN SIE @edate DATUM AN = '2018-11-15';
DEKLARIEREN @roomnum INT = 5;


-- Berechnen Sie die Anzahl der Aufenthaltstage
DECLARE @days INT;
SETZE @days = DATEDIFF(TAG, @sdate, @edate)+1;

-- Hotelnummer, die die Datumsspanne erfüllt, Anzahl der Zimmer
IF EXISTS(select * aus tempdb.dbo.sysobjects, wobei id = object_id(N'tempdb.. ##temp_hotel') und typ='U')
BEGINN
    Drop-Tabelle ##temp_hotel
ENDE

WÄHLE ta.hotel_id IN ##temp_hotel AUS
(SELECT ri. [Datum], rt.hotel_id, SUM(ri.remain) room_num VON room_info ri links VERBINDEN room_type rt auf ri.room_id=rt.room_id wobei @sdate <= [Datum] und [Datum] <= @edate GRUPPE NACH ri angeben. [Datum],rt.hotel_id MIT SUMM(REMAIN) >= 5) ta
GRUPPE NACH ta.hotel_id MIT ZAHL(*) = @days



-- Berechnet gemäß dem Hotel (konfigurieren Sie den Mindestraumtyp pro Tag)

IF EXISTS(select * aus tempdb.dbo.sysobjects, wobei id = object_id(N'tempdb.. ##temp_result') und typ='U')
BEGINN
    Drop-Tabelle ##temp_result
ENDE
-- Vorläufige Ergebnistabelle Hoteldatum Zimmertyp ID Zimmertyp Name Anzahl der Zimmer Preis Hotel Tagesgesamt Hoteldurchschnittlicher Hotelpreis Gesamt Hotelpreis Hotel Gesamt Hotelpreis Gesamt Tagesdurchschnittspreis Hotel Gesamt Tagesdurchschnittspreis des Hotels Gesamt Tagespreis
TABELLE ERSTELLEN ##temp_result(
    hotel_id INT,
    hotel_name Varchar(255),
    [Datum] DATE,
    room_id INT,
    room_name VARCHAR (255),
    room_num INT,
    Zimmerpreis DECIMAL,
    dsumprice DECIMAL,
    davgprice DECIMAL,
    Sumprische DEZIMAL,
    SUMAVGPRIC DEZIMAL
)

ERKLÄREN @hid INT; -- Hotel-ID
DECLARE @infoid INT; -- Info-ID
--bestätigen, dass der Cursor eine Sammlung ist
DECLARE my_cursor Cursor für (SELECT hotel_id aus ##temp_hotel);
--Öffne den Cursor--
Öffne my_cursor
--Start-Schleifen-Cursorvariablen--
Hol als Nächstes von my_cursor in @hid
während @@FETCH_STATUS = 0 – den Zustand des zuletzt von der FETCH-Anweisung ausgeführten Cursors zurückgibt --
BEGINN      
    -- Basierend auf der Hotel-ID wird das wiederkehrende Datum bepreist
    IF EXISTS(select * aus tempdb.dbo.sysobjects, wobei id = object_id(N'tempdb.. ##temp_room') und tipp='U')
    BEGINN
        Drop-Table ##temp_room
    ENDE

    -- Hotels nach Datum, mit den nach Datum sortierten Zimmern Tarif
    WÄHLEN SIE info_id, [Datum], Preis, Remain, room_id IN ##temp_room VON dbo.room_info AUS, WOBEI @sdate <= [Datum] und [Datum] <= @edate BLEIBEN UND > 0 BLEIBEN UND room_id IN (WÄHLEN SIE rt.room_id AUS dbo.room_type rt WO rt.hotel_id=@hid) NACH [Datum] ASC, Preis ASC
   
   
    DEKLARIEREN @thisrdate DATUM = NULL; -- Datum
    DECLARE @thisrnum INT=0; -- Anzahl der am aktuellen Datum ausgewählten Zimmer
   
    DEKLARIEREN @rdate DATUM = NULL; -- Datum
    DECLARE @rmnum INT = 0; -- Anzahl der Zimmer nach Raumtyp
   
    -- Zyklus nach Datum
    DEKLARIEREN @my_cursor2 CURSOR;
    Set @my_cursor2 = CURSOR FÜR AUSGEWÄHLTE info_id AUS ##temp_room ORDNUNG NACH [DATUM] ASC, PREIS ASC
    ÖFFNE @my_cursor2;
    HOL ALS NÄCHSTES VON @my_cursor2 IN @infoid
    WHILE(@@FETCH_STATUS=0)
    BEGINN
        --##temp_result
        WÄHLEN SIE @rmnum=bleiben, @rdate=[Datum] AUS ##temp_room WO info_id=@infoid
        WENN (@thisrdate NULL IST ODER @thisrdate != @rdate)
        BEGINN
            DRUCKEN @rdate
            SETZE @thisrdate = @rdate;
            SET @thisrnum = 0;
        ENDE
        -- Typ des Raums zur Auswahl der Dosierungsform
        WIF(@thisrnum <= @roomnum)
        BEGINN
            WENN (@thisrnum + @rmnum > @roomnum)
            BEGINN
                -- Die Anzahl der Räume, die du benutzen musst
                SET @rmnum = @roomnum-@thisrnum;
            ENDE
        ENDE
        ODER   
        BEGINN
            -- Für dieses Datum ist kein Platz erforderlich.
            SETZE @rmnum = 0;
        ENDE
        
        IF (@rmnum > 0)
        BEGINN
            -- Ergebnisse nach angegebener Zahl addieren
            EINFÜGEN IN ##temp_result(hotel_id, hotel_name, [Datum], room_id, room_name, room_num, Roomprice, Dsumprice, davgprice, Sumpric, Sumavgpric)
            WÄHLE @hid, '', @thisrdate, room_id, '', @rmnum, preis, 0, 0, 0, 0 AUS ##temp_room WOBEI info_id = @infoid
            
            -- Die Anzahl der Zimmer hat den berechneten Durchschnittspreis erreicht
            SETZE @thisrnum = @thisrnum + @rmnum;
            WENN (@thisrnum = @roomnum)
            BEGINN
                -- Gesamtpreis nach Hotel, berechnet für Daten
                AKTUALISIERUNG ##temp_result SETZE dsumprice=(SELECT SUM(room_num*roomprice) AUS ##temp_result tr WO tr.hotel_id=@hid UND tr.[ datum]=@thisrdate) WOBEI hotel_id=@hid UND [Datum]=@thisrdate
                -- Berechnen Sie den durchschnittlichen Zimmerpreis nach Hotel, Gesamtpreis nach Datum
                AKTUALISIERUNG ##temp_result SETZE davgprice=(dsumprice/@roomnum) WO hotel_id=@hid UND [date]=@thisrdate
            ENDE
        ENDE

        ALS NÄCHSTES HOLEN SIE VON @my_cursor2 IN @infoid;
    ENDE   
    nahe @my_cursor2;  --Schalte den Cursor aus
    Deal locate @my_cursor2;   --Release-Cursor

    -- Nach Hotel, berechnet den Gesamtpreis des Hotels
    UPDATE ##temp_result SETZE SUMPRIC=(SELECT SUM(room_num*roomprice) AUS ##temp_result tr WO tr.hotel_id=@hid) WO hotel_id=@hid
    -- Berechnen Sie den durchschnittlichen Tagespreis des gesamten Zimmers im Hotel
    AKTUALISIERUNG ##temp_result SETZE sumavgpric=(sumpric/@roomnum/@days) WO hotel_id=@hid

    FETCH als nächstes von my_cursor in @hid – zum nächsten Cursor gehen, keine Deadloops
ENDE  
schließen my_cursor – schließen Sie den Cursor
Deallocate my_cursor – den Cursor loslassen


-- Fügen Sie den Hotelnamen und den Zimmertyp zur temporären Tabelle hinzu
UPDATE ##temp_result SETZE hotel_name=(SELECT ht.hotel_name FROM dbo.hotel ht WO ht.hotel_id=##temp_result.hotel_id),
room_name=(WÄHLE rt.room_name AUS dbo.room_type RT AUS, WO rt.room_id=##temp_result.room_id)


-- Überprüfen Sie die Ergebnisse in der Ergebnistabelle
WÄHLEN SIE * AUS ##temp_result




-- Beenden des Leerens temporärer Tabellen
IF EXISTS(select * aus tempdb.dbo.sysobjects, wobei id = object_id(N'tempdb.. ##temp_hotel') und typ='U')
BEGINN
    Drop-Tabelle ##temp_hotel
ENDE
IF EXISTS(select * aus tempdb.dbo.sysobjects, wobei id = object_id(N'tempdb.. ##temp_room') und tipp='U')
BEGINN
    Drop-Table ##temp_room
ENDE
IF EXISTS(select * aus tempdb.dbo.sysobjects, wobei id = object_id(N'tempdb.. ##temp_result') und typ='U')
BEGINN
    Drop-Tabelle ##temp_result
ENDE

Punktzahl

Anzahl der Teilnehmer1MB+1 beitragen+1 Zusammenbruch Grund
Administrator + 1 + 1 Ich bin begeistert davon, anderen zu helfen!

Alle Bewertungen sehen

 Vermieter| Veröffentlicht am 06.12.2018 14:11:48 |
xzxmustwin Veröffentlicht am 6.12.2018 11:58
Um ehrlich zu sein, ist die Struktur dieser Tabelle etwas unvernünftig

Die Hausaufgabenfragen, die der Lehrer für die emmmm-Datenbank stellt, könnten tatsächlich unvernünftig sein, und ich habe sie nicht gesehen, wenn ich sie nicht sehr gut gelernt habe...
Der Schlüssel bleibt jedoch die Problemlösungsideen. Ich möchte meine Freunde fragen, ob ihr Vorschläge habt?
 Vermieter| Veröffentlicht am 06.12.2018 14:09:20 |
LZZSF veröffentlicht am 6.12.2018 09:07
MySQL ist veraltet, kein Client, gib mir das Skript für SQL Server

Entschuldigung, ich habe SQL Sever noch nicht benutzt, vielleicht weil es nur Unterricht ist, also hat der Lehrer uns gebeten, MySQL dafür zu verwenden. Wenn deine Freunde bereit sind, ihre Ideen zu teilen, vielen Dank.
Veröffentlicht am 05.12.2018 21:57:13 |
Ich werde zur QQ-Gruppe gehen, um eine Belohnung von 10 Yuan auszusprechen, um zu sehen, ob dir jemand helfen kann, nein zu antworten
Veröffentlicht am 06.12.2018 07:56:39 |
Hilfe
Veröffentlicht am 06.12.2018 09:07:08 |
MySQL ist veraltet, kein Client, gib mir das Skript für SQL Server

Punktzahl

Anzahl der Teilnehmer1MB+1 beitragen+1 Zusammenbruch Grund
Administrator + 1 + 1 Begeistert!

Alle Bewertungen sehen

Veröffentlicht am 06.12.2018 11:24:25 |
LZZSF veröffentlicht am 6.12.2018 09:07
MySQL ist veraltet, kein Client, gib mir das Skript für SQL Server

Es wird empfohlen, die Idee zu besprechen und den Vermieter als Referenz verwenden zu lassen, was ebenfalls möglich sein sollte
Veröffentlicht am 06.12.2018 11:58:37 |
Um ehrlich zu sein, ist die Struktur dieser Tabelle etwas unvernünftig

Punktzahl

Anzahl der Teilnehmer1MB+1 beitragen+1 Zusammenbruch Grund
Administrator + 1 + 1 Begeistert!

Alle Bewertungen sehen

 Vermieter| Veröffentlicht am 06.12.2018 14:07:29 |
Veröffentlicht am 5.12.2018, 21:57 Uhr
Ich werde zur QQ-Gruppe gehen, um eine Belohnung von 10 Yuan auszusprechen, um zu sehen, ob dir jemand helfen kann, nein zu antworten

Danke, falls jemand antworten möchte, schicke ich dir den roten Umschlag :)
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com