Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 23250|Odpowiedź: 11

[Nowy numer] Jak wybrać najtańsze a pokoje

[Skopiuj link]
Opublikowano 05.12.2018 21:32:38 | | | |
Teraz są do dyspozycji dwa stoły: room_type i room_info
Są 3 hotele z identyfikatorami 1~3. Następnie każdy hotel ma 3 typy pokoi, z identyfikatorami odpowiednio 1~9.
room_type zawiera nazwę i nazwę oraz odpowiadający im identyfikator hotelu dla każdego typu pokoju
W room_info przechowywana jest cena każdego dnia, każdy typ pokoju oraz liczba pozostałych pomieszczeń.
Tematy, które chciałbym zadać, to:
Określ przedział czasowy i liczbę pokoi do rezerwacji, zapytaj hotele, typy pokoi i ich średnie ceny spełniające warunki (czas, liczba pozostałych pokoi) i sortuj je według średniej ceny od najniższej do najwyższej. Wyniki to hotele, wybrane kombinacje i ilości pokoi oraz najniższa średnia cena.
##不要求为同一房型, ale to musi być ten sam hotel i możesz zmienić typ pokoju w trakcie drogi.
##比如, czas zameldowania to 2018-11-14~2018-11-15, a liczba zarezerwowanych pokoi to 5
##返回选择酒店A, 11-14 wybierz 4 typy pokoi z ID 3, 1 typ pokoju z ID 2, 11-15 wybierz 3 typy pokoi z ID 3, 2 typy z ID 2, a najniższa cena to 2000
##老师要求只能用sql语句, implementacja MySQL nie może używać Pythona, C++ itd
Nie pisałem tego przez cały dzień, a podobny temat nie pojawił się w Internecie, więc przyszedłem prosić bogów o pomoc i chcę zapytać was, jak to osiągnąć, dziękuję~







Poprzedni:Samozrelacjonowane dzielenie się doświadczeniami przez program PHP
Następny:Polityka na egzamin podyplomowy 2019 Xu Tao i materiały sprintowe Xiao
Opublikowano 06.12.2018 17:00:58 |
Ten post został ostatnio edytowany przez Miaolinsen 6.12.2018 o 17:03

Nie zrobiłem tego z mysql, zrobiłem to z mssql:


/*
Określ przedział czasowy i liczbę pokoi do rezerwacji, zapytaj hotele, typy pokoi i ich średnie ceny spełniające warunki (czas, liczba pozostałych pokoi) i sortuj je według średniej ceny od najniższej do najwyższej. Wyniki to hotele, wybrane kombinacje i ilości pokoi oraz najniższa średnia cena.
##不要求为同一房型, ale to musi być ten sam hotel i możesz zmienić typ pokoju w trakcie drogi. -- Parsowanie: Oznacza to, że nie ma potrzeby rozważania typu pokoju, tylko liczba pokoi
##比如, wybierz godzinę zameldowania 2018-11-14~2018-11-15, a liczba zarezerwowanych pokoi wynosi 5 -- Analiza: Hotel musi mieścić się w przedziale dat, a zapotrzebowanie na liczbę pokoi jest codziennie (jeśli w danym dniu nikogo nie ma, nie spełni standardu)
##返回选择酒店A, 11-14 wybierz 4 typy pokoi z ID 3, 1 typ pokoju z ID 2, 11-15 wybierz 3 typy pokoi z ID 3, 2 typy pokoi z ID 2, a najniższa cena to 2000 -- Analiza: Oblicz średnią cenę według minimalnej konfiguracji na dzień
##老师要求只能用sql语句, implementacja mysql, nie może używać pythona, c++ itd. */


-- Parametry wejściowe, zakres dat, liczba wymaganych pomieszczeń
DEKLARUJ @sdate DATA = '2018-11-14';
DEKLARUJ @edate DATA = '2018-11-15';
DEKLARUJ @roomnum INT = 5;


-- Oblicz liczbę dni pobytu
DEKLARUJ @days INT;
USTAW @days = DATEDIFF(DZIEŃ, @sdate, @edate)+1;

-- Numer hotelu spełniający zakres dat, liczba pokoi
JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_hotel') i type='U')
POCZĄTEK
    Drop table ##temp_hotel
KONIEC

WYBIERZ ta.hotel_id do ##temp_hotel Z
(WYBIERZ ri. [date], rt.hotel_id, SUM(ri.remain) room_num OD room_info ri LEFT JOIN JOIN room_type rt na ri.room_id=rt.room_id gdzie @sdate <= [data] i [date] <= @edate GRUPA BY ri. [data],rt.hotel_id POSIADAJĄCEJ SUM(pozostałość) >= 5) ta
GRUPA PRZEZ ta.hotel_id LICZENIE(*) = @days



-- Obliczane według hotelu (konfiguruj minimalny typ pokoju na dzień)

JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_result') i type='U')
POCZĄTEK
    Drop table ##temp_result
KONIEC
-- Wstępna tabela wyników Hotelowy Pokój randkowy Typ ID Typ pokoju Nazwa Liczba pokoi Cena pokoju Hotel Dzienna Całkowita Cena hotelu Średnia cena hotelu Całkowita Cena hotelu Całkowita Średnia dzienna cena hotelu Łączna dzienna cena pokoju
UTWÓRZ TABELĘ ##temp_result(
    hotel_id INT,
    hotel_name varchar(255),
    [randka] DATE,
    room_id INT,
    room_name VARCHAR(255),
    room_num INT,
    roomprice DECIMAL,
    dsumprice DZIESIĘTNY,
    DAGPRICE DZIESIĘTNY,
    podsumowanie DZIESIĘTNE,
    sumavgpric DZIESIĘTNY
)

DEKLARUJ @hid INT; -- Identyfikator hotelu
DEKLARUJ @infoid INT; -- ID informacji
--potwierdzaj, że kursor jest zbiorem
ZADEKLARUJ my_cursor kursora dla (WYBIERZ hotel_id z ##temp_hotel);
--Otwórz kursor--
otwórz my_cursor
--Zmienne kursora pętli startowej--
Aportuj następnego z my_cursor do @hid
podczas gdy @@FETCH_STATUS = 0 -- zwraca stan ostatniego kursora wykonanego przez polecenie FETCH --
POCZĄTEK      
    -- Na podstawie identyfikatora hotelu, data powtarzająca się jest ustalana w cenie
    JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_room') i type='U')
    POCZĄTEK
        Drop table ##temp_room
    KONIEC

    -- Hotele, według daty, z pokojami posortowanymi według daty Cenka
    WYBIERZ info_id, [data], cena, pozostań, room_id DO ##temp_room Z dbo.room_info GDZIE @sdate <= [data] i [data] <= @edate I POZOSTAŃ > 0 I room_id W (WYBIERZ rt.room_id Z dbo.room_type rt, GDZIE rt.hotel_id=@hid) KOLEJNOŚĆ WEDŁUG [data] ASC, cena ASC
   
   
    DECLARE @thisrdate DATE = NULL; -- Data
    ZADEKLARUJ @thisrnum INT=0; -- Liczba wybranych pokoi w obecnym dniu
   
    DECLARE @rdate DATE = NULL; -- Data
    ZADEKLARUJ @rmnum INT = 0; -- Liczba pokoi według typu pokoju
   
    -- Cykl według daty
    DEKLARUJ @my_cursor2 KURSOR;
    ustaw @my_cursor2 = KURSOR DLA SELECT info_id Z ##temp_room KOLEJNOŚĆ PRZEZ [data] ASC, cena ASC
    OTWARTE @my_cursor2;
    PRZYNIEŚ NASTĘPNE Z @my_cursor2 DO @infoid
    WHILE(@@FETCH_STATUS=0)
    POCZĄTEK
        --##temp_result
        SELECT @rmnum=remain, @rdate=[data] OD ##temp_room GDZIE info_id=@infoid
        JEŚLI (@thisrdate JEST NULL LUB @thisrdate != @rdate)
        POCZĄTEK
            DRUK @rdate
            ZESTAW @thisrdate = @rdate;
            ZESTAW @thisrnum = 0;
        KONIEC
        -- Typ pokoju wyboru formy dawkowania
        JEŚLI(@thisrnum <= @roomnum)
        POCZĄTEK
            IF (@thisrnum + @rmnum > @roomnum)
            POCZĄTEK
                -- Liczba pokoi, które musisz wykorzystać
                ZESTAW @rmnum = @roomnum-@thisrnum;
            KONIEC
        KONIEC
        ELSE   
        POCZĄTEK
            -- Na ten dzień nie jest potrzebne miejsce
            ZESTAW @rmnum = 0;
        KONIEC
        
        IF (@rmnum > 0)
        POCZĄTEK
            -- Dodaj wyniki według określonej liczby
            WSTAW DO ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, cena, dsumprice, davgprice, sumpric, sumavgpric)
            WYBIERZ @hid, '', @thisrdate, room_id, '', @rmnum, cena, 0, 0, 0, 0 OD ##temp_room GDZIE info_id = @infoid
            
            -- Liczba pokoi osiągnęła obliczoną średnią cenę
            ZESTAW @thisrnum = @thisrnum + @rmnum;
            IF (@thisrnum = @roomnum)
            POCZĄTEK
                -- Całkowita cena według hotelu, obliczona dla dat
                AKTUALIZACJA ##temp_result USTAW dsumprice=(WYBIERZ SUM(room_num*roomprice) Z ##temp_result tr, GDZIE tr.hotel_id=@hid I TR.[ data]=@thisrdate) GDZIE hotel_id=@hid I [data]=@thisrdate
                -- Oblicz średnią cenę pokoju według hotelu, całkowitą cenę według daty
                AKTUALIZACJA ##temp_result USTAW davgprice=(dsumprice/@roomnum) GDZIE hotel_id=@hid I [data]=@thisrdate
            KONIEC
        KONIEC

        PRZYNIEŚ DALEJ Z @my_cursor2 DO @infoid;
    KONIEC   
    bliski @my_cursor2;  --Wyłącz kursor
    deallocate @my_cursor2;   --kurzor zwolnienia

    -- Według hotelu oblicz całkowitą cenę hotelu
    AKTUALIZACJA ##temp_result USTAW sumpric=(WYBIERZ SUM(room_num*roomprice) Z ##temp_result tr GDZIE tr.hotel_id=@hid) GDZIE hotel_id=@hid
    -- Obliczanie średniej dziennej ceny całego pokoju w hotelu
    AKTUALIZACJA ##temp_result ZESTAW sumavgpric=(sumpric/@roomnum/@days) GDZIE hotel_id=@hid

    POBIERZ NASTĘPNY z my_cursor do @hid – przejdź do następnego kursora, bez martwych pętli
KONIEC  
Zamknij my_cursor – zamknij kursor
Deallocate my_cursor - zwolnij kursor


-- Dodaj nazwę hotelu i typ pokoju do stolika tymczasowego
AKTUALIZACJA ##temp_result USTAW hotel_name=(WYBIERZ ht.hotel_name Z dbo.hotel ht, GDZIE ht.hotel_id=##temp_result.hotel_id),
room_name=(WYBIERZ rt.room_name Z dbo.room_type rt, GDZIE rt.room_id=##temp_result.room_id)


-- Sprawdź wyniki z tabeli wyników
WYBIERZ * Z ##temp_result




-- Zakończenie czyszczenia tabel tymczasowych
JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_hotel') i type='U')
POCZĄTEK
    Drop table ##temp_hotel
KONIEC
JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_room') i type='U')
POCZĄTEK
    Drop table ##temp_room
KONIEC
JEŚLI ISTNIEJE(wybierz * z tempdb.dbo.sysobjects gdzie id = object_id(N'tempdb.. ##temp_result') i type='U')
POCZĄTEK
    Drop table ##temp_result
KONIEC

Wynik

Liczba uczestników1MB+1 przyczynić się+1 Zapaść powód
Admin + 1 + 1 Entuzjastycznie podchodzimy do pomagania innym!

Zobacz wszystkie oceny

 Ziemianin| Opublikowano 06.12.2018 14:11:48 |
xzxmustwin Opublikowano 2018-12-6 11:58
Szczerze mówiąc, struktura tej tabeli jest trochę nierozsądna

Zadania domowe zadane przez nauczyciela bazy danych emmmm mogą być rzeczywiście nierozsądne, a nie widziałem tego, jeśli nie nauczyłem się ich dobrze...
Jednak kluczem są pomysły na rozwiązywanie problemów, chciałbym zapytać znajomych, czy macie jakieś sugestie?
 Ziemianin| Opublikowano 06.12.2018 14:09:20 |
lzzsf opublikowano 2018-12-6 09:07
MySQL jest przestarzały, nie ma klienta, daj mi skrypt dla SQL Server

Przepraszam, jeszcze nie używałem SQL Server, może dlatego, że to tylko nauczanie, więc nauczyciel poprosił nas, żebyśmy użyli mysql. Jeśli twoi przyjaciele są chętni podzielić się swoimi pomysłami, bardzo dziękuję.
Opublikowano 05.12.2018 21:57:13 |
Pójdę do grupy QQ, żeby zaoferować nagrodę w wysokości 10 juanów, żeby zobaczyć, czy ktoś pomoże ci odpowiedzieć nie
Opublikowano 06.12.2018 07:56:39 |
Pomoc
Opublikowano 06.12.2018 09:07:08 |
MySQL jest przestarzały, nie ma klienta, daj mi skrypt dla SQL Server

Wynik

Liczba uczestników1MB+1 przyczynić się+1 Zapaść powód
Admin + 1 + 1 Entuzjastycznie!

Zobacz wszystkie oceny

Opublikowano 06.12.2018 11:24:25 |
lzzsf opublikowano 2018-12-6 09:07
MySQL jest przestarzały, nie ma klienta, daj mi skrypt dla SQL Server

Zaleca się omówić pomysł i pozwolić właścicielowi wykorzystać go jako referencję, co również powinno być możliwe
Opublikowano 06.12.2018 11:58:37 |
Szczerze mówiąc, struktura tej tabeli jest trochę nierozsądna

Wynik

Liczba uczestników1MB+1 przyczynić się+1 Zapaść powód
Admin + 1 + 1 Entuzjastycznie!

Zobacz wszystkie oceny

 Ziemianin| Opublikowano 06.12.2018 14:07:29 |
Opublikowano 5 grudnia 2018 21:57
Pójdę do grupy QQ, żeby zaoferować nagrodę w wysokości 10 juanów, żeby zobaczyć, czy ktoś pomoże ci odpowiedzieć nie

Dzięki, jeśli ktoś zechce odpowiedzieć, wyślę wam czerwoną kopertę :)
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com