Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 23250|Απάντηση: 11

[Νέο τεύχος] Πώς να επιλέξετε τα φθηνότερα n δωμάτια

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 5/12/2018 9:32:38 μ.μ. | | | |
Τώρα υπάρχουν δύο πίνακες για χρήση, room_type και room_info
Υπάρχουν 3 ξενοδοχεία με ταυτότητες 1~3. Στη συνέχεια, κάθε ξενοδοχείο έχει 3 τύπους δωματίων, με ταυτότητες 1~9 αντίστοιχα.
Το room_type περιέχει το όνομα, το αναγνωριστικό και το αντίστοιχο αναγνωριστικό ξενοδοχείου για κάθε τύπο δωματίου
Αυτό που αποθηκεύεται στο room_info είναι η τιμή κάθε ημέρας, κάθε τύπος δωματίου και ο αριθμός των δωματίων που απομένουν.
Τα θέματα που θα ήθελα να ρωτήσω είναι:
Καθορίστε το χρονικό εύρος και τον αριθμό των δωματίων για κράτηση, ρωτήστε τα ξενοδοχεία, τις επιλογές τύπων δωματίων και τις μέσες τιμές τους που πληρούν τις προϋποθέσεις (χρόνος, αριθμός δωματίων που απομένουν) και ταξινομήστε τα κατά μέση τιμή από τη χαμηλότερη στην υψηλότερη. Τα αποτελέσματα περιλαμβάνουν ξενοδοχεία, επιλεγμένους συνδυασμούς δωματίων και ποσότητες και τη χαμηλότερη μέση τιμή.
##不要求为同一房型, αλλά πρέπει να είναι το ίδιο ξενοδοχείο και μπορείτε να αλλάξετε τον τύπο δωματίου στη μέση.
##比如, η ώρα του check-in είναι 2018-11-14~2018-11-15 και ο αριθμός των δωματίων που έχουν κρατηθεί είναι 5
##返回选择酒店A, 11-14 επιλέξτε 4 τύπους δωματίων με ID 3, 1 τύπο δωματίου με ID 2, 11-15 επιλέξτε 3 τύπους δωματίων με ID 3, 2 τύπους δωματίων με ID 2, και η χαμηλότερη τιμή είναι 2000
##老师要求只能用sql语句, η υλοποίηση MySQL δεν μπορεί να χρησιμοποιήσει Python, C++, κ.λπ
Δεν το έγραψα για μια μέρα και δεν είδα παρόμοιο θέμα στο Διαδίκτυο, οπότε ήρθα να ζητήσω βοήθεια από τους θεούς και θέλω να σας ρωτήσω πώς να το πετύχω, ευχαριστώ~







Προηγούμενος:Η αυτοαναφερόμενη εμπειρία του πιθήκου προγράμματος PHP
Επόμενος:Πολιτική μεταπτυχιακών εισαγωγικών εξετάσεων 2019 Υλικό σπριντ Xu Tao και Xiao Xiurong
Δημοσιεύτηκε στις 6/12/2018 5:00:58 μ.μ. |
Αυτό το άρθρο επεξεργάστηκε τελευταία φορά από το χρήστη Miaolinsen στις 2018-12-6 17:03

Δεν το έκανα με mysql, το έκανα με mssql:


/*
Καθορίστε το χρονικό εύρος και τον αριθμό των δωματίων για κράτηση, ρωτήστε τα ξενοδοχεία, τις επιλογές τύπων δωματίων και τις μέσες τιμές τους που πληρούν τις προϋποθέσεις (χρόνος, αριθμός δωματίων που απομένουν) και ταξινομήστε τα κατά μέση τιμή από τη χαμηλότερη στην υψηλότερη. Τα αποτελέσματα περιλαμβάνουν ξενοδοχεία, επιλεγμένους συνδυασμούς δωματίων και ποσότητες και τη χαμηλότερη μέση τιμή.
##不要求为同一房型, αλλά πρέπει να είναι το ίδιο ξενοδοχείο και μπορείτε να αλλάξετε τον τύπο δωματίου στη μέση. -- Ανάλυση: Σημαίνει ότι δεν χρειάζεται να λάβετε υπόψη τον τύπο δωματίου, λαμβάνεται υπόψη μόνο ο αριθμός των δωματίων
##比如, επιλέξτε την ώρα check-in 2018-11-14~2018-11-15 και ο αριθμός των δωματίων που έχουν κρατηθεί είναι 5 -- Ανάλυση: Το ξενοδοχείο πρέπει να βρίσκεται στο εύρος ημερομηνιών και υπάρχει ζήτηση για τον αριθμό των δωματίων κάθε μέρα (αν δεν υπάρχει κανείς μια συγκεκριμένη ημέρα, δεν θα πληροί τα πρότυπα)
##返回选择酒店A, 11-14 επιλέξτε 4 τύπους δωματίων με ID 3, 1 τύπο δωματίου με ID 2, 11-15 επιλέξτε 3 τύπους δωματίων με ID 3, 2 τύπους δωματίων με ID 2, και η χαμηλότερη τιμή είναι 2000 -- Ανάλυση: Υπολογίστε τη μέση τιμή σύμφωνα με την ελάχιστη διαμόρφωση ανά ημέρα
##老师要求只能用sql语句, υλοποίηση MySQL, δεν μπορεί να χρησιμοποιήσει Python, C++, κ.λπ. */


-- Εισερχόμενες παράμετροι εύρος ημερομηνιών, αριθμός δωματίων που απαιτούνται
ΔΗΛΏΣΤΕ @sdate ΗΜΕΡΟΜΗΝΊΑ = '2018-11-14';
ΔΗΛΏΣΤΕ @edate ΗΜΕΡΟΜΗΝΊΑ = «15-11-2018»·
ΔΗΛΏΣΤΕ @roomnum INT = 5;


-- Υπολογίστε τον αριθμό των ημερών διαμονής
ΔΗΛΏΣΤΕ @days INT;
ΟΡΙΣΜΌΣ @days = DATEDIFF(ΗΜΈΡΑ, @sdate, @edate)+1;

-- Αριθμός ξενοδοχείου που πληροί το εύρος ημερομηνιών, αριθμός δωματίων
IF EXISTS(επιλέξτε * από tempdb.dbo.sysobjects όπου id = object_id(N'tempdb.. ##temp_hotel') και type='U')
ΑΡΧΗ
    drop table ##temp_hotel
ΤΕΛΟΣ

ΕΠΙΛΕΞΤΕ ta.hotel_id στο ##temp_hotel ΑΠΟ
(ΕΠΙΛΕΞΤΕ ri. [ημερομηνία], rt.hotel_id, SUM(ri.remain) room_num ΑΠΟ room_info ri ΑΡΙΣΤΕΡΑ JOIN room_type rt στις ri.room_id=rt.room_id όπου @sdate <= [ημερομηνία] και [ημερομηνία] <= @edate ΟΜΑΔΑ ΚΑΤΑ ri. [ημερομηνία],rt.hotel_id ΕΧΟΝΤΑΣ ΑΘΡΟΙΣΜΑ(υπόλοιπο) >= 5) ta
ΟΜΑΔΟΠΟΙΉΣΤΕ ΚΑΤΆ ta.hotel_id ΈΧΟΝΤΑΣ COUNT(*) = @days



-- Υπολογίζεται σύμφωνα με το ξενοδοχείο (διαμορφώστε τον ελάχιστο τύπο δωματίου ανά ημέρα)

IF EXISTS(επιλέξτε * από tempdb.dbo.sysobjects όπου id = object_id(N'tempdb.. ##temp_result') και type='U')
ΑΡΧΗ
    drop table ##temp_result
ΤΕΛΟΣ
-- Προσωρινός Πίνακας Αποτελεσμάτων Ξενοδοχείο Ημερομηνία Τύπος Δωματίου ID Τύπος Δωματίου Όνομα Αριθμός Δωματίων Τιμή Ξενοδοχείου Ημερήσια Σύνολο Ξενοδοχείου Ημερήσια Μέση Τιμή Ξενοδοχείου Συνολική Τιμή Ξενοδοχείου Συνολική Ημερήσια Μέση Τιμή Ξενοδοχείου Συνολική Ημερήσια Τιμή Δωματίου
ΔΗΜΙΟΥΡΓΊΑ ΠΊΝΑΚΑ ##temp_result(
    hotel_id INT,
    hotel_name varchar(255),
    [ημερομηνία] ΗΜΕΡΟΜΗΝΊΑ,
    room_id INT,
    room_name VARCHAR(255),
    room_num INT,
    τιμή δωματίου ΔΕΚΑΔΙΚΉ,
    dsumprice DECIMAL,
    davgprice DECIMAL,
    sumpric DECIMAL,
    sumavgpric ΔΕΚΑΔΙΚΟ
)

ΔΗΛΏΣΤΕ @hid INT; -- Ταυτότητα ξενοδοχείου
ΔΗΛΏΣΤΕ @infoid INT; -- αναγνωριστικό πληροφοριών
--επιβεβαιώστε ότι ο κέρσορας είναι μια συλλογή
ΔΗΛΩΣΗ my_cursor δρομέα για (ΕΠΙΛΕΞΤΕ hotel_id από ##temp_hotel).
--Ανοίξτε τον κέρσορα--
Ανοίξτε my_cursor
--Μεταβλητές δρομέα βρόχου έναρξης--
Φέρτε το επόμενο από my_cursor στο @hid
ενώ @@FETCH_STATUS = 0 -- επιστρέφει την κατάσταση του τελευταίου δρομέα που εκτελέστηκε από τη δήλωση FETCH --
ΑΡΧΗ      
    -- Με βάση το αναγνωριστικό του ξενοδοχείου, η επαναλαμβανόμενη ημερομηνία τιμολογείται
    IF EXISTS(επιλέξτε * από tempdb.dbo.sysobjects όπου id = object_id(N'tempdb.. ##temp_room') και type='U')
    ΑΡΧΗ
        πίνακας πτώσης ##temp_room
    ΤΕΛΟΣ

    -- Ξενοδοχεία, κατά ημερομηνία, με δωμάτια ταξινομημένα κατά ημερομηνία Τιμή
    ΕΠΙΛΈΞΤΕ info_id, [ημερομηνία], τιμή, υπόλοιπο room_id ΣΤΟ ##temp_room ΑΠΌ dbo.room_info ΌΠΟΥ @sdate <= [ημερομηνία] και [ημερομηνία] <= @edate ΚΑΙ ΠΑΡΑΜΕΊΝΕΤΕ > 0 ΚΑΙ room_id ΜΈΣΑ (ΕΠΙΛΈΞΤΕ rt.room_id ΑΠΌ dbo.room_type rt WHERE rt.hotel_id=@hid) ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ [ημερομηνία] ASC, τιμή ASC
   
   
    ΔΗΛΏΣΤΕ @thisrdate ΗΜΕΡΟΜΗΝΊΑ = ΆΚΥΡΗ. -- Ημερομηνία
    ΔΗΛΏΣΤΕ @thisrnum INT=0; -- Αριθμός δωματίων που επιλέχθηκαν την τρέχουσα ημερομηνία
   
    ΔΗΛΏΣΤΕ @rdate ΗΜΕΡΟΜΗΝΊΑ = ΆΚΥΡΗ. -- Ημερομηνία
    ΔΗΛΏΣΤΕ @rmnum INT = 0; -- Αριθμός δωματίων ανά τύπο δωματίου
   
    -- Κύκλος κατά ημερομηνία
    ΔΗΛΏΣΤΕ @my_cursor2 ΔΡΟΜΈΑ.
    set @my_cursor2 = ΔΡΟΜΕΑΣ ΓΙΑ ΕΠΙΛΟΓΗ info_id ΑΠΟ ##temp_room ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ [ημερομηνία] ASC, τιμή ASC
    ΑΝΟΙΧΤΌ @my_cursor2?
    ΦΈΡΤΕ ΤΟ ΕΠΌΜΕΝΟ ΑΠΌ ΤΟ @my_cursor2 ΣΤΟ @infoid
    ΕΝΏ(@@FETCH_STATUS=0)
    ΑΡΧΗ
        --##temp_result
        ΕΠΙΛΈΞΤΕ @rmnum=REMAIN, @rdate=[ημερομηνία] ΑΠΌ ##temp_room ΌΠΟΥ info_id=@infoid
        ΑΝ (@thisrdate ΕΊΝΑΙ NULL Ή @thisrdate != @rdate)
        ΑΡΧΗ
            ΕΚΤΥΠΩΣΗ @rdate
            ΣΕΤ @thisrdate = @rdate;
            ΣΕΤ @thisrnum = 0;
        ΤΕΛΟΣ
        -- Τύπος δωματίου επιλογής δοσολογικής μορφής
        IF(@thisrnum <= @roomnum)
        ΑΡΧΗ
            ΑΝ (@thisrnum + @rmnum > @roomnum)
            ΑΡΧΗ
                -- Ο αριθμός των δωματίων που πρέπει να χρησιμοποιήσετε
                ΣΕΤ @rmnum = @roomnum-@thisrnum;
            ΤΕΛΟΣ
        ΤΕΛΟΣ
        ΑΛΛΙΏΣ   
        ΑΡΧΗ
            -- Δεν απαιτείται δωμάτιο για εκείνη την ημερομηνία
            ΣΕΤ @rmnum = 0;
        ΤΕΛΟΣ
        
        ΑΝ (@rmnum > 0)
        ΑΡΧΗ
            -- Προσθέστε αποτελέσματα με καθορισμένο αριθμό
            ΕΙΣΑΓΩΓΗ ΣΤΟ ##temp_result(hotel_id, hotel_name, [ημερομηνία], room_id, room_name, room_num, τιμή δωματίου, dsumprice, davgprice, sumpric, sumavgpric)
            ΕΠΙΛΈΞΤΕ @hid, '', @thisrdate, room_id, '', @rmnum, τιμή, 0, 0, 0, 0 ΑΠΌ ##temp_room ΌΠΟΥ info_id = @infoid
            
            -- Ο αριθμός των δωματίων έχει φτάσει την υπολογιζόμενη μέση τιμή
            ΣΕΤ @thisrnum = @thisrnum + @rmnum;
            ΑΝ (@thisrnum = @roomnum)
            ΑΡΧΗ
                -- Συνολική τιμή ανά ξενοδοχείο, υπολογισμένη για ημερομηνίες
                ΕΝΗΜΕΡΩΣΗ ##temp_result SET dsumprice=(SELECT SUM(room_num*roomprice) ΑΠΟ ##temp_result tr WHERE tr.hotel_id=@hid AND tr.[ ημερομηνία]=@thisrdate) ΌΠΟΥ hotel_id=@hid ΚΑΙ [ημερομηνία]=@thisrdate
                -- Υπολογίστε τη μέση τιμή δωματίου ανά ξενοδοχείο, συνολική τιμή ανά ημερομηνία
                ΕΝΗΜΈΡΩΣΗ ##temp_result ΟΡΊΣΤΕ davgprice=(dsumprice/@roomnum) ΌΠΟΥ hotel_id=@hid ΚΑΙ [ημερομηνία]=@thisrdate
            ΤΕΛΟΣ
        ΤΕΛΟΣ

        ΦΈΡΤΕ ΤΟ ΕΠΌΜΕΝΟ ΑΠΌ ΤΟ @my_cursor2 ΣΤΟ @infoid.
    ΤΕΛΟΣ   
    κλείστε @my_cursor2?  --Απενεργοποιήστε τον κέρσορα
    συμφωνία @my_cursor2?   --αφήστε τον κέρσορα

    -- Ανά ξενοδοχείο, υπολογίστε τη συνολική τιμή του ξενοδοχείου
    ΕΝΗΜΕΡΩΣΗ ##temp_result SET sumpric=(SELECT SUM(room_num*τιμή δωματίου) ΑΠΟ ##temp_result tr WHERE tr.hotel_id=@hid) ΠΟΥ hotel_id=@hid
    -- Υπολογίστε τη μέση ημερήσια τιμή του συνολικού δωματίου στο ξενοδοχείο
    ΕΝΗΜΕΡΩΣΗ ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) WHERE hotel_id=@hid

    ΑΝΑΚΤΗΣΗ επόμενου από my_cursor σε @hid - μεταβείτε στον επόμενο κέρσορα, χωρίς νεκρούς βρόχους
ΤΕΛΟΣ  
κλείσιμο my_cursor -- κλείσιμο του δρομέα
deallocate my_cursor - αφήστε τον κέρσορα


-- Προσθέστε το όνομα του ξενοδοχείου και το όνομα του τύπου δωματίου στον προσωρινό πίνακα
ΕΝΗΜΕΡΩΣΗ ##temp_result SET hotel_name=(SELECT ht.hotel_name FROM dbo.hotel ht WHERE ht.hotel_id=##temp_result.hotel_id),
room_name=(ΕΠΙΛΟΓΗ rt.room_name ΑΠΟ dbo.room_type rt WHERE rt.room_id=##temp_result.room_id)


-- Ελέγξτε τα αποτελέσματα από τον πίνακα αποτελεσμάτων
ΕΠΙΛΈΞΤΕ * ΑΠΌ ##temp_result




-- Τερματισμός εκκαθάρισης προσωρινών πινάκων
IF EXISTS(επιλέξτε * από tempdb.dbo.sysobjects όπου id = object_id(N'tempdb.. ##temp_hotel') και type='U')
ΑΡΧΗ
    drop table ##temp_hotel
ΤΕΛΟΣ
IF EXISTS(επιλέξτε * από tempdb.dbo.sysobjects όπου id = object_id(N'tempdb.. ##temp_room') και type='U')
ΑΡΧΗ
    πίνακας πτώσης ##temp_room
ΤΕΛΟΣ
IF EXISTS(επιλέξτε * από tempdb.dbo.sysobjects όπου id = object_id(N'tempdb.. ##temp_result') και type='U')
ΑΡΧΗ
    drop table ##temp_result
ΤΕΛΟΣ

Παρτιτούρα

Αριθμός συμμετεχόντων1ΜΒ+1 συνεισφέρω+1 Κατάρρευση λόγος
διαχειριστής + 1 + 1 Ενθουσιώδης για να βοηθάς τους άλλους!

Δείτε όλες τις αξιολογήσεις

 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 6/12/2018 2:11:48 μ.μ. |
xzxmustwin Δημοσιεύτηκε στις 2018-12-6 11:58
Για να είμαι ειλικρινής, η δομή αυτού του πίνακα είναι λίγο παράλογη

Οι ερωτήσεις για το σπίτι που αναθέτει ο δάσκαλος της βάσης δεδομένων emmmm μπορεί πράγματι να είναι παράλογες και δεν το είδα αν δεν το έμαθα πολύ καλά...
Ωστόσο, το κλειδί εξακολουθεί να είναι οι ιδέες επίλυσης προβλημάτων, θέλω να ρωτήσω τους φίλους μου αν έχετε κάποιες προτάσεις;
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 6/12/2018 2:09:20 μ.μ. |
lzzsf Δημοσιεύτηκε στις 2018-12-6 09:07
Η MySQL είναι ξεπερασμένη, δεν υπάρχει πελάτης, δώστε μου το σενάριο για τον SQL Server

Συγγνώμη, δεν έχω χρησιμοποιήσει ακόμα το SQL Sever, ίσως επειδή είναι απλώς διδασκαλία, οπότε ο δάσκαλος μας ζήτησε να χρησιμοποιήσουμε mysql για να το κάνουμε. Εάν οι φίλοι σας είναι πρόθυμοι να μοιραστούν τις ιδέες τους, σας ευχαριστώ πολύ.
Δημοσιεύτηκε στις 5/12/2018 9:57:13 μ.μ. |
Θα πάω στην ομάδα QQ για να προσφέρω μια ανταμοιβή 10 γιουάν για να δω αν κάποιος μπορεί να σας βοηθήσει να απαντήσετε όχι
Δημοσιεύτηκε στις 6/12/2018 7:56:39 π.μ. |
Βοήθεια
Δημοσιεύτηκε στις 6/12/2018 9:07:08 π.μ. |
Η MySQL είναι ξεπερασμένη, δεν υπάρχει πελάτης, δώστε μου το σενάριο για τον SQL Server

Παρτιτούρα

Αριθμός συμμετεχόντων1ΜΒ+1 συνεισφέρω+1 Κατάρρευση λόγος
διαχειριστής + 1 + 1 Ενθουσιώδης!

Δείτε όλες τις αξιολογήσεις

Δημοσιεύτηκε στις 6/12/2018 11:24:25 π.μ. |
lzzsf Δημοσιεύτηκε στις 2018-12-6 09:07
Η MySQL είναι ξεπερασμένη, δεν υπάρχει πελάτης, δώστε μου το σενάριο για τον SQL Server

Συνιστάται να μιλήσετε για την ιδέα και να αφήσετε τον ιδιοκτήτη να τη χρησιμοποιήσει ως αναφορά, κάτι που θα πρέπει επίσης να είναι δυνατό
Δημοσιεύτηκε στις 6/12/2018 11:58:37 π.μ. |
Για να είμαι ειλικρινής, η δομή αυτού του πίνακα είναι λίγο παράλογη

Παρτιτούρα

Αριθμός συμμετεχόντων1ΜΒ+1 συνεισφέρω+1 Κατάρρευση λόγος
διαχειριστής + 1 + 1 Ενθουσιώδης!

Δείτε όλες τις αξιολογήσεις

 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 6/12/2018 2:07:29 μ.μ. |
Δημοσιεύτηκε στις 2018-12-5 21:57
Θα πάω στην ομάδα QQ για να προσφέρω μια ανταμοιβή 10 γιουάν για να δω αν κάποιος μπορεί να σας βοηθήσει να απαντήσετε όχι

Ευχαριστώ, αν κάποιος είναι πρόθυμος να απαντήσει, θα σας στείλω τον κόκκινο φάκελο :)
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com