Bu gönderi en son 2018-12-6 17:03 tarihinde Miaolinsen tarafından düzenlenmiştir
MySQL ile yapmadım, mssql ile yaptım:
/* Zaman aralığını ve rezervasyon yapılacak oda sayısını belirtin, otelleri, oda türleri seçimlerini ve koşullara uygun ortalama fiyatlarını (zaman, kalan oda sayısı) sorgulayın ve ortalama fiyata göre en düşükten en yükseğe doğru sıralayın. Sonuçlar otelleri, seçilmiş oda kombinasyonları ve miktarlarını ile en düşük ortalama fiyatı içeriyor. ##不要求为同一房型 ama aynı otel olmalı ve oda tipini ortada değiştirebilirsin. -- Ayrıştırma: Oda tipini dikkate almamaya gerek olmadığını, sadece oda sayısının dikkate alındığı anlamına gelir ##比如, giriş saatini 2018-11-14~2018-11-15 seçin ve rezerve edilen oda sayısı 5 olur -- Analiz: Otelin tarih aralığında olması gerekir ve her gün oda sayısına talep vardır (belirli bir günde kimse yoksa standartlara uymaz) ##返回选择酒店A, 11-14 4 oda tipi (3 numaralı kişi), 1 oda tipi 2, 11-15 numaralı 3 oda tipi, 2 oda tipi 2 (2) seç ve en düşük fiyat 2000 -- Analiz: Günlük minimum konfigürasyona göre ortalama fiyatı hesaplayın ##老师要求只能用sql语句, mySQL uygulaması, python, c++ vb. kullanamaz. */
-- Gelen parametreler, tarih aralığı, gerekli oda sayısı DECLARE @sdate TARIH = '2018-11-14'; DECLARE @edate TARIH = '2018-11-15'; DEKARE @roomnum INT = 5;
-- Kalma günlerini hesaplayın DECLARE @days INT; SET @days = DATEDIFF(DAY, @sdate, @edate)+1;
-- Tarih aralığına uyan otel numarası, oda sayısı EĞER VARSA(tempdb.dbo.sysobjects içinden * seç burada id = object_id(N'tempdb.. ##temp_hotel') ve type='U') BAŞLA Drop Table ##temp_hotel SON
BURADAN ##temp_hotel IÇINE ta.hotel_id SEÇ (SELECT ri. [tarih], rt.hotel_id, SUM(ri.kalır) room_num room_info ri SOLDAN ri.room_id=rt.room_id üzerinde rt room_type BIRLEŞIR, burada @sdate <= [tarih] ve [tarih] <= ri ile @edate GRUP. [date],rt.hotel_id HAVING SUM(KALMA) >= 5) ta COUNT(*) = @days OLAN ta.hotel_id GRUP
-- Otele göre hesaplanır (günlük minimum oda tipini yapılandırın)
EĞER VARSA(tempdb.dbo.sysobjects içinden * seç burada id = object_id(N'tempdb.. ##temp_result') ve type='U') BAŞLA Drop Table ##temp_result SON -- Geçici Sonuçlar Tablosu Otel Tarih Oda Tipi Kimlik Oda Tipi Adı Oda Fiyatı Oda Fiyatı Otel Günlük Toplam Otel Günlük Ortalama Otel Fiyatı Otel Toplam Toplam Günlük Oda Fiyatı TABLO ##temp_result( hotel_id INT, hotel_name varchar(255), [tarih] TARIH, room_id INT, room_name VARCHAR(255), room_num INT, oda fiyatı ONLUK DELIK, dsumprice DECIMAL, davgprice DECIMAL, sumpric DECIMAL, sumavgpric DECIMAL
)
DECLARE @hid INT; -- Otel kimliği DECLARE @infoid INT; -- bilgi kimliği --imlecin bir koleksiyon olduğunu doğrulamak DECLARE my_cursor imleci (##temp_hotel'dan SELECT hotel_id); --İmleci aç-- Açık my_cursor --Başlatma Döngüsü İmleci Değişkenleri-- Bir Sonraki my_cursor'dan @hid @@FETCH_STATUS = 0 -- ise FETCH ifadesi ile yürütülen son imlecin durumunu döndürür -- BAŞLA -- Otel kimliğine göre, tekrarlayan tarih fiyatlandırılır EĞER VARSA(tempdb.dbo.sysobjects içinden * seç burada id = object_id(N'tempdb.. ##temp_room') ve type='U') BAŞLA Masayı bırak ##temp_room SON
-- Oteller, tarihe göre, odalar tarihe göre sıralanmış Fiyat SEÇ info_id, [tarih], fiyat, kal, room_id SEÇ U##temp_room BURADAN dbo.room_info BURADAN @sdate <= [tarih] ve [tarih] <= @edate VE > KALIN VE room_id IÇINDE KALIN (SEÇ rt.room_id IÇINDEN dbo.room_type RT BURADA rt.hotel_id=@hid) ORDER BY [tarih] ASC, fiyat ASC
DECLARE @thisrdate DATE = NULL; -- Tarih DECLARE @thisrnum INT=0; -- Mevcut tarihte seçilen oda sayısı
DECLARE @rdate DATE = NULL; -- Tarih DECLARE @rmnum INT = 0; -- Oda tipine göre oda sayısı
-- Tarihe göre döngü İMLEÇ @my_cursor2 BILDIR; @my_cursor2 = ## ÜZERINDEN SEÇ info_id IÇIN İMLEÇ temp_room [tarih] ASC, fiyat ASC OPEN @my_cursor2; SONRAKI @my_cursor2'DEN @infoid WHILE(@@FETCH_STATUS=0) BAŞLA --##temp_result SEÇ @rmnum=KAL, @rdate=[TARIH] U##temp_room BURADAN info_id=@infoid EĞER (@thisrdate NULL VEYA @thisrdate != @rdate) BAŞLA YAZKI @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; SON -- Dozaj formu seçim odası tipi IF(@thisrnum <= @roomnum) BAŞLA IF (@thisrnum + @rmnum > @roomnum) BAŞLA -- Kullanmanız gereken oda sayısı KÜME @rmnum = @roomnum-@thisrnum; SON SON ELSE BAŞLA -- O tarih için yer gerekmiyor SET @rmnum = 0; SON
IF (@rmnum > 0) BAŞLA -- Sonuçları belirtilen sayıya göre ekleyin ##temp_result(hotel_id, hotel_name, [tarih], room_id, room_name, room_num, oda fiyatı, dsumprice, davgprice, sumpric, sumavgpric) SEÇIN @hid, '', @thisrdate, room_id, '', @rmnum, PRICE, 0, 0, 0, 0 BURADAKI ###temp_room BURADA info_id = @infoid
-- Oda sayısı hesaplanan ortalama fiyata ulaştı SET @thisrnum = @thisrnum + @rmnum; IF (@thisrnum = @roomnum) BAŞLA -- Otel bazında toplam fiyat, tarihler için hesaplanır GÜNCELLEME ##temp_result SET dsumprice=(SELECT SUM(room_num*roomprice) FROM ##temp_result TR BURADA tr.hotel_id=@hid VE TR.[ tarih]=@thisrdate) BURADA hotel_id=@hid VE [tarih]=@thisrdate -- Otel başına ortalama oda fiyatını, tarihe göre toplam fiyatı hesaplayın GÜNCELLEME ##temp_result DAVGPRICE=(dsumprice/@roomnum) KUR, BURADA hotel_id=@hid VE [tarih]=@thisrdate SON SON
SONRAKI @my_cursor2'DAN @infoid'YE; SON yakın @my_cursor2; --İmmalci kapat Deallocate @my_cursor2; --imleci bırak
-- Otel ile toplam otel fiyatını hesaplayın GÜNCELLEME ##temp_result SUMPRIC=(SUM(room_num*oda fiyatı) SEÇ U##temp_result TR BURADA tr.hotel_id=@hid) BURADA hotel_id=@hid -- Oteldeki toplam odanın ortalama günlük fiyatını hesaplayın GÜNCELLEME ##temp_result SUMAVGPRIC=(sumpric/@roomnum/@days) KUR BURADA hotel_id=@hid
my_cursor'den @hid'e GETIR - sonraki imleciye geç, ölü döngü yok SON my_cursor kapat -- imleci kapat Dağıt my_cursor - İmleci bırak
-- Geçici masaya otel adını ve oda tipi adını ekle GÜNCELLEME ##temp_result hotel_name=(DBO.hotel NOKTASINDAN ht.hotel_name SEÇ BURADA ht.hotel_id=##temp_result.hotel_id), room_name=(dbo.room_type RT'DEN rt.room_name SEÇ BURADA rt.room_id=##temp_result.room_id)
-- Sonuç tablosundan sonuçları kontrol edin ##'DAN * SEÇ temp_result
-- Geçici masaların sonunu temizleme EĞER VARSA(tempdb.dbo.sysobjects içinden * seç burada id = object_id(N'tempdb.. ##temp_hotel') ve type='U') BAŞLA Drop Table ##temp_hotel SON EĞER VARSA(tempdb.dbo.sysobjects içinden * seç burada id = object_id(N'tempdb.. ##temp_room') ve type='U') BAŞLA Masayı bırak ##temp_room SON EĞER VARSA(tempdb.dbo.sysobjects içinden * seç burada id = object_id(N'tempdb.. ##temp_result') ve type='U') BAŞLA Drop Table ##temp_result SON
|