Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 23250|Yanıt: 11

[Yeni Sayı] En ucuz n odaları nasıl seçilir

[Bağlantıyı kopyala]
Yayınlandı 5.12.2018 21:32:38 | | | |
Şimdi kullanılacak iki masa var: room_type ve room_info
1~3 kimlik kartı olan 3 otel bulunmaktadır. Her otelin 3 oda tipi vardır ve kimlikleri sırasıyla 1~9'dur.
room_type, her oda tipinin adını, kimliğini ve ilgili otel kimliğini içerir
room_info içinde saklananlar, her günün fiyatı, her oda tipi ve kalan oda sayısıdır.
Sormak istediğim konular şunlardır:
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.
##比如, giriş saati 2018-11-14~2018-11-15 ve rezerve edilen oda sayısı 5
##返回选择酒店A, 11-14, ID 3 ile 4 oda tipi, ID 2 ile 1 oda tipi, 11-15 ID 3 oda tipi seç, 2 ID 2 oda tipi seç ve en düşük fiyat 2000
##老师要求只能用sql语句, MySQL uygulaması Python, C++ vb. kullanamaz
Bir gün boyunca yazmadım ve internette benzer bir konu görmedim, bu yüzden tanrılardan yardım istemeye geldim ve bunu nasıl başaracağınızı sormak istiyorum, teşekkürler~







Önceki:PHP programı ape'nin kendi raporu olan deneyim paylaşımı
Önümüzdeki:2019 lisansüstü giriş sınavı siyaseti Xu Tao ve Xiao Xiurong'un sprint materyalleri
Yayınlandı 6.12.2018 17:00:58 |
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

Puan

Katılımcı sayısı1MB+1 Katkı+1 Çökmek sebep
Admin + 1 + 1 Başkalarına yardım etmeye hevesliyim!

Tüm puanları gör

 Ev sahibi| Yayınlandı 6.12.2018 14:11:48 |
xzxmustwin 2018-12-6 tarihinde 11:58 tarihinde yayınlandı
Dürüst olmak gerekirse, bu tablonun yapısı biraz mantıksız

Emmmm veritabanı öğretmeni tarafından verilen ödev soruları gerçekten mantıksız olabilir ve eğer çok iyi öğrenmediysem görmedim...
Ama anahtar nokta hâlâ problem çözme fikirleri, arkadaşlarıma herhangi bir öneriniz olup olmadığını sormak istiyorum.
 Ev sahibi| Yayınlandı 6.12.2018 14:09:20 |
lzzsf 2018-12-6 09:07 tarihinde yayınlandı
MySQL modası geçmiş, istemcisi yok, SQL Server için scripti ver

Üzgünüm, henüz SQL Sever kullanmadım, belki sadece öğretim olduğu için, öğretmen bizden mysql kullanmamızı istedi. Arkadaşlarınız fikirlerini paylaşmaya istekliyse, çok teşekkür ederim.
Yayınlandı 5.12.2018 21:57:13 |
QQ grubuna gidip 10 yuan ödül teklif edeceğim, biri size hayır cevabına yardımcı olabilir mi diye bakacağım
Yayınlandı 6.12.2018 07:56:39 |
Yardım
Yayınlandı 6.12.2018 09:07:08 |
MySQL modası geçmiş, istemcisi yok, SQL Server için scripti ver

Puan

Katılımcı sayısı1MB+1 Katkı+1 Çökmek sebep
Admin + 1 + 1 Hevesli!

Tüm puanları gör

Yayınlandı 6.12.2018 11:24:25 |
lzzsf 2018-12-6 09:07 tarihinde yayınlandı
MySQL modası geçmiş, istemcisi yok, SQL Server için scripti ver

Fikri konuşmak ve ev sahibinin referans olarak kullanmasına izin vermek önerilir, bu da mümkün olmalıdır
Yayınlandı 6.12.2018 11:58:37 |
Dürüst olmak gerekirse, bu tablonun yapısı biraz mantıksız

Puan

Katılımcı sayısı1MB+1 Katkı+1 Çökmek sebep
Admin + 1 + 1 Hevesli!

Tüm puanları gör

 Ev sahibi| Yayınlandı 6.12.2018 14:07:29 |
2018-12-5 21:57 tarihinde yayımlandı
QQ grubuna gidip 10 yuan ödül teklif edeceğim, biri size hayır cevabına yardımcı olabilir mi diye bakacağım

Teşekkürler, cevap vermek isteyen olursa, kırmızı zarfı gönderirim :)
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com