Posting ini terakhir diedit oleh Miaolinsen pada 2018-12-6 17:03
Saya tidak melakukannya dengan mysql, saya melakukannya dengan mssql:
/* Tentukan rentang waktu dan jumlah kamar yang akan dipesan, kueri hotel, pilihan jenis kamar, dan harga rata-rata yang memenuhi persyaratan (waktu, jumlah kamar yang tersisa), dan urutkan berdasarkan harga rata-rata dari terendah ke tertinggi. Hasilnya termasuk hotel, kombinasi dan jumlah kamar tertentu, dan harga rata-rata terendah. ##不要求为同一房型, tetapi harus hotel yang sama, dan Anda dapat mengubah tipe kamar di tengah jalan. -- Parsing: Artinya tidak perlu mempertimbangkan tipe kamar, hanya jumlah kamar yang dipertimbangkan ##比如, pilih waktu check-in 2018-11-14~2018-11-15, dan jumlah kamar yang dipesan adalah 5 -- Analisis: Hotel harus berada dalam rentang tanggal, dan ada permintaan untuk jumlah kamar setiap hari (jika tidak ada seorang pun pada hari tertentu, itu tidak akan memenuhi standar) ##返回选择酒店A, 11-14 pilih 4 tipe kamar dengan ID 3, 1 tipe kamar dengan ID 2, 11-15 pilih 3 tipe kamar dengan ID 3, 2 tipe kamar dengan ID 2, dan harga terendah adalah 2000 -- Analisis: Hitung harga rata-rata sesuai konfigurasi minimum per hari ##老师要求只能用sql语句, implementasi MySQL, tidak dapat menggunakan Python, C++, dll. */
-- Parameter masuk, rentang tanggal, jumlah kamar yang dibutuhkan NYATAKAN TANGGAL @sdate = '14-11-2018'; NYATAKAN TANGGAL @edate = '15-11-2018'; NYATAKAN @roomnum INT = 5;
-- Hitung jumlah hari menginap NYATAKAN @days INT; ATUR @days = DATEDIFF(HARI, @sdate, @edate)+1;
-- Nomor hotel yang memenuhi rentang tanggal, jumlah kamar IF EXISTS(pilih * dari tempdb.dbo.sysobjects di mana id = object_id(N'tempdb.. ##temp_hotel') dan ketik='U') MULAI Tabel jatuhkan ##temp_hotel AKHIR
PILIH ta.hotel_id ke ##temp_hotel DARI (PILIH ri. [date], rt.hotel_id, SUM(ri.remain) room_num FROM room_info ri LEFT JOIN room_type rt on ri.room_id=rt.room_id where @sdate <= [date] dan [date] <= @edate GROUP BY ri. [tanggal],rt.hotel_id MEMILIKI JUMLAH(sisa) >= 5) ta KELOMPOKKAN BERDASARKAN ta.hotel_id MEMILIKI COUNT(*) = @days
-- Dihitung sesuai dengan hotel (konfigurasikan tipe kamar minimum per hari)
IF EXISTS(pilih * dari tempdb.dbo.sysobjects di mana id = object_id(N'tempdb.. ##temp_result') dan type='U') MULAI Drop Table ##temp_result AKHIR -- Tabel Hasil Sementara Hotel Tanggal Tipe Kamar ID Tipe Kamar Nama Jumlah Kamar Harga Hotel Harian Total Hotel Rata-rata Harian Hotel Harga Hotel Total Hotel Total Harga Harian Hotel Total Harga Harian Hotel Total Harga Kamar Harian BUAT TABEL ##temp_result( hotel_id INT, hotel_name varchar(255), [tanggal] TANGGAL, room_id INT, room_name VARCHAR(255), room_num INT, harga kamar DESIMAL, dsumprice DESIMAL, davgprice DESIMAL, DESIMAL sumprik, DESIMAL sumavgprik
)
MENYATAKAN @hid INT; -- ID Hotel DEKLARASIKAN @infoid INT; -- ID info --menegaskan bahwa kursor adalah koleksi DEKLARASIKAN kursor my_cursor untuk (PILIH hotel_id dari ##temp_hotel); --Buka kursor-- Buka my_cursor --Mulai Variabel Kursor Perulangan-- ambil berikutnya dari my_cursor ke @hid sementara @@FETCH_STATUS = 0 -- mengembalikan status kursor terakhir yang dieksekusi oleh pernyataan FETCH -- MULAI -- Berdasarkan ID hotel, tanggal berulang dihargai IF EXISTS(pilih * dari tempdb.dbo.sysobjects di mana id = object_id(N'tempdb.. ##temp_room') dan type='U') MULAI Drop Tabel ##temp_room AKHIR
-- Hotel, berdasarkan tanggal, dengan kamar diurutkan berdasarkan tanggal Harga PILIH info_id, [tanggal], harga, tetap, room_id KE ##temp_room DARI dbo.room_info DI MANA @sdate <= [tanggal] dan [tanggal] <= @edate DAN tetap > 0 DAN room_id DI (PILIH rt.room_id DARI dbo.room_type rt WHERE rt.hotel_id=@hid) ORDER BY [date] ASC, harga ASC
DEKLARASIKAN @thisrdate TANGGAL = NULL; -- Tanggal NYATAKAN @thisrnum INT=0; -- Jumlah kamar yang dipilih pada tanggal saat ini
DEKLARASIKAN @rdate TANGGAL = NULL; -- Tanggal DEKLARASIKAN @rmnum INT = 0; -- Jumlah kamar berdasarkan tipe kamar
-- Siklus berdasarkan tanggal NYATAKAN @my_cursor2 KURSOR; atur @my_cursor2 = KURSOR UNTUK PILIH info_id DARI ##temp_room ORDER BY [date] ASC, harga ASC BUKA @my_cursor2; AMBIL BERIKUTNYA DARI @my_cursor2 KE @infoid SEMENTARA(@@FETCH_STATUS=0) MULAI --##temp_result PILIH @rmnum=remain, @rdate=[tanggal] DARI ##temp_room DI MANA info_id=@infoid JIKA (@thisrdate ADALAH NULL ATAU @thisrdate != @rdate) MULAI CETAK @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; AKHIR - Jenis kamar pemilihan bentuk sediaan JIKA (@thisrnum <= @roomnum) MULAI JIKA (@thisrnum + @rmnum > @roomnum) MULAI -- Jumlah kamar yang perlu Anda gunakan SET @rmnum = @roomnum-@thisrnum; AKHIR AKHIR LAIN MULAI -- Tidak diperlukan kamar untuk tanggal tersebut ATUR @rmnum = 0; AKHIR
JIKA (@rmnum > 0) MULAI -- Tambahkan hasil dengan nomor yang ditentukan MASUKKAN KE ##temp_result(hotel_id, hotel_name, [tanggal], room_id, room_name, room_num, harga kamar, dsumprice, davgprice, sumpric, sumavgpric) PILIH @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 DARI ##temp_room DI MANA info_id = @infoid
-- Jumlah kamar telah mencapai harga rata-rata yang dihitung SET @thisrnum = @thisrnum + @rmnum; JIKA (@thisrnum = @roomnum) MULAI -- Total harga menurut hotel, dihitung untuk tanggal PERBARUI ##temp_result ATUR dsumprice=(PILIH SUM(room_num*roomprice) DARI ##temp_result tr DI MANA tr.hotel_id=@hid DAN tr.[ date]=@thisrdate) DI MANA hotel_id=@hid DAN [tanggal]=@thisrdate -- Hitung tarif kamar rata-rata berdasarkan hotel, harga total berdasarkan tanggal UPDATE ##temp_result SET davgprice=(dsumprice/@roomnum) DI MANA hotel_id=@hid DAN [date]=@thisrdate AKHIR AKHIR
AMBIL SELANJUTNYA DARI @my_cursor2 KE @infoid; AKHIR dekat @my_cursor2; --Matikan kursor membatalkan alokasi @my_cursor2; --lepaskan kursor
-- Berdasarkan hotel, hitung total harga hotel PERBARUI ##temp_result ATUR sumpric=(PILIH SUM(room_num*harga kamar) DARI ##temp_result tr DI MANA tr.hotel_id=@hid) DI MANA hotel_id=@hid -- Hitung harga harian rata-rata dari total kamar di hotel UPDATE ##temp_result ATUR sumavgpric=(sumpric/@roomnum/@days) DI MANA hotel_id=@hid
AMBIL berikutnya dari my_cursor ke @hid - pergi ke kursor berikutnya, tidak ada deadloop AKHIR tutup my_cursor -- tutup kursor Batalkan alokasi my_cursor - lepaskan kursor
-- Tambahkan nama hotel dan nama tipe kamar ke tabel sementara PERBARUI ##temp_result ATUR hotel_name=(PILIH ht.hotel_name DARI dbo.hotel ht DI MANA ht.hotel_id=##temp_result.hotel_id), room_name=(PILIH rt.room_name DARI dbo.room_type rt DI MANA rt.room_id=##temp_result.room_id)
-- Periksa hasil dari tabel hasil PILIH * DARI ##temp_result
-- Akhiri pembersihan tabel sementara IF EXISTS(pilih * dari tempdb.dbo.sysobjects di mana id = object_id(N'tempdb.. ##temp_hotel') dan ketik='U') MULAI Tabel jatuhkan ##temp_hotel AKHIR IF EXISTS(pilih * dari tempdb.dbo.sysobjects di mana id = object_id(N'tempdb.. ##temp_room') dan type='U') MULAI Drop Tabel ##temp_room AKHIR IF EXISTS(pilih * dari tempdb.dbo.sysobjects di mana id = object_id(N'tempdb.. ##temp_result') dan type='U') MULAI Drop Table ##temp_result AKHIR
|