Αυτό το άρθρο επεξεργάστηκε τελευταία φορά από το χρήστη 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 ΤΕΛΟΣ
|