이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 23250|회답: 11

[신간호] 가장 저렴한 n개의 방을 선택하는 방법

[링크 복사]
게시됨 2018. 12. 5. 오후 9:32:38 | | | |
이제 사용할 수 있는 표는 room_type와 room_info 두 개뿐입니다
ID가 1~3인 호텔이 3곳 있습니다. 각 호텔은 각각 1~9 ID의 3가지 객실 유형이 있습니다.
room_type에는 각 객실 유형별 이름, ID, 그리고 해당 호텔 ID가 포함되어 있습니다
room_info에 저장된 것은 하루의 가격, 각 방 유형, 그리고 남은 방 수입니다.
제가 묻고 싶은 주제는 다음과 같습니다:
예약 가능한 시간대와 객실 수를 지정하고, 호텔, 객실 유형 및 조건에 맞는 평균 가격(시간, 남은 객실 수)을 조회한 뒤, 평균 가격별로 낮은 순서대로 정렬하세요. 결과에는 호텔, 선택된 객실 조합과 수량, 그리고 가장 낮은 평균 가격이 포함됩니다.
##不要求为同一房型, 하지만 같은 호텔이어야 하고, 중간에 방 유형을 바꿀 수 있어.
##比如, 체크인 시간은 2018-11-14~2018-11-15이며, 예약된 객실 수는 5개입니다
##返回选择酒店A, 11-14 ID 3 방 유형 4가지, ID 2 방 유형 1 선택, 11-15 ID 3 방 유형 3 선택, ID 2 방 2 유형 선택 및 최저가 2000
##老师要求只能用sql语句, MySQL 구현은 Python, C++ 등을 사용할 수 없습니다
하루 동안 쓰지 않았고, 인터넷에서도 비슷한 주제를 본 적이 없어서 신들에게 도움을 청하러 왔고, 어떻게 하면 되는지 여쭤보고 싶어요, 감사합니다~







이전의:PHP 프로그램 원숭이의 자기 신고 경험 공유
다음:2019년 대학원 입시시험 정치 쉬타오와 샤오쉬우롱의 스프린트 자료
게시됨 2018. 12. 6. 오후 5:00:58 |
이 게시물은 Miaolinsen이 2018-12-6 17:03에 마지막으로 편집했습니다

저는 mysql이 아니라 mssql로 했습니다:


/*
예약 가능한 시간대와 객실 수를 지정하고, 호텔, 객실 유형 및 조건에 맞는 평균 가격(시간, 남은 객실 수)을 조회한 뒤, 평균 가격별로 낮은 순서대로 정렬하세요. 결과에는 호텔, 선택된 객실 조합과 수량, 그리고 가장 낮은 평균 가격이 포함됩니다.
##不要求为同一房型, 하지만 같은 호텔이어야 하고, 중간에 방 유형을 바꿀 수 있어. -- 구문 분석: 방 유형을 고려할 필요 없이 방 수만 고려한다는 뜻입니다
##比如, 체크인 시간 2018-11-14~2018-11-15를 선택하면 예약된 객실 수가 5개입니다 -- 분석: 호텔은 날짜 범위 내에 있어야 하며, 매일 객실 수에 대한 수요가 있습니다(특정 날에 객실이 없으면 기준을 충족하지 못합니다)
##返回选择酒店A, 11-14 ID 3의 방 유형 4가지, ID 2의 방 유형 1개, 11-15 ID 3의 방 유형 선택, ID 2의 방 유형 2개, 최저가는 2000 -- 분석: 하루 최소 구성에 따라 평균 가격을 계산하세요
##老师要求只能用sql语句, MySQL 구현은 파이썬, C++ 등을 사용할 수 없습니다. */


-- 들어오는 매개변수, 날짜 범위, 필요한 방 수
날짜 선언 = '2018-11-14'@sdate;
날짜 선언 = '2018-11-15'@edate;
@roomnum 인터셉트 = 5 선언;


-- 체류 일수를 계산하세요
@days 인터셉트 선언;
SET @days = DATEDIFF(일, @sdate, @edate)+1;

-- 날짜 범위에 맞는 호텔 번호, 객실 수
만약 EXISTS(tempdb.dbo.sysobjects 중에서 * 선택, 여기서 id = object_id(N'tempdb.. ##temp_hotel') 그리고 type='U')
시작
    드롭 테이블 ##temp_hotel


ta.hotel_id 선택하여 ##temp_hotel
(리를 선택하세요. [날짜], rt.hotel_id, SUM(ri.remain) room_num room_info RI 왼쪽에서 room_type RT에 합류하여 ri.room_id=rt.room_id @sdate <= [날짜]와 [날짜] = < = @edate RI로 묶음. [날짜],rt.hotel_id sum(remain) >= 5) ta
COUNT(*) = @days ta.hotel_id에 따른 군



-- 호텔별로 계산됨 (일일 최소 객실 유형 설정)

만약 EXISTS(tempdb.dbo.sysobjects 중에서 * 선택, 여기서 id = object_id(N'tempdb.. ##temp_result') 그리고 type='U')
시작
    드롭 테이블 ##temp_result

-- 임시 결과 표 호텔 날짜 객실 유형 ID 객실 유형 이름, 객실 수 호텔 일일 총 호텔 평균 호텔 가격 호텔 총 호텔 호텔 총 일일 평균 호텔 가격
테이블 생성 ##temp_result(
    hotel_id 지능,
    hotel_name 바르하르(255),
    [날짜] 날짜,
    room_id 지능,
    room_name 바르차르(255),
    room_num 지능,
    객실 가격 소수,
    dsumprice 10진수,
    davgprice 소수점,
    소수점 소수점,
    sumavgpric 소수
)

@hid 선언하세요; -- 호텔 ID
지능 @infoid 선언하세요; -- 정보 ID
--커서가 집합임을 확인한다
(##temp_hotel에서 hotel_id 선택);my_cursor
--커서 열기--
오픈 my_cursor
--시작 루프 커서 변수--
다음 my_cursor에서 @hid
반면 @@FETCH_STATUS = 0 -- 는 FETCH 문이 실행한 마지막 커서의 상태를 반환합니다 --
시작      
    -- 호텔 ID를 기준으로 반복 방문 날짜의 가격이 정해집니다
    만약 EXISTS(tempdb.dbo.sysobjects 중에서 * 선택, 여기서 id = object_id(N'tempdb.. ##temp_room') 그리고 type='U')
    시작
        테이블 드롭 ##temp_room
    끝

    -- 호텔, 날짜별로 정렬된 객실 요금
    info_id, [날짜], 가격, 잔여, room_id을 dbo.room_info에서 ##temp_room로 선택하세요. 여기서 @sdate <= [날짜]와 [날짜] <= @edate 그리고 0> 그리고 room_id (rt.room_id dbo.room_type에서 선택 여기서 rt.hotel_id=@hid) 순서 [날짜] 상승, 가격 상승
   
   
    날짜 선언 @thisrdate = 무효; -- 날짜
    INT=0을 선언@thisrnum; -- 현재 날짜에 선택된 방 수
   
    날짜 선언 = null@rdate; -- 날짜
    INT = 0@rmnum 선언하세요; -- 방 유형별 방 수
   
    -- 날짜별 사이클
    @my_cursor2 사제를 선언하라;
    셋 @my_cursor2 = ##temp_room 순서 [날짜] ASC, 가격 ASC 중 선택 info_id 커서
    오픈 @my_cursor2;
    다음 것을 가져오세요, @my_cursor2에서 @infoid
    WHILE(@@FETCH_STATUS=0)
    시작
        --##temp_result
        @rmnum=남음, @rdate=[날짜] ##temp_room에서 선택 info_id=@infoid
        만약 (@thisrdate이 영 또는 @thisrdate != @rdate)
        시작
            인쇄 @rdate
            집합 @thisrdate = @rdate;
            집합 @thisrnum = 0;
        끝
        -- 제형상 선택실 유형
        IF(@thisrnum <= @roomnum)
        시작
            만약 (@thisrnum + @rmnum > @roomnum)
            시작
                -- 사용해야 하는 방 수
                집합 @rmnum = @roomnum-@thisrnum;
            끝
        끝
        그렇지 않으면   
        시작
            -- 그 데이트에는 공간이 필요 없어요
            집합 @rmnum = 0;
        끝
        
        IF (@rmnum > 0)
        시작
            -- 지정된 숫자로 결과를 더하기
            ##temp_result(hotel_id, hotel_name, [날짜], room_id, room_name, room_num, 방값, dsumprice, davgprice, sumpric, sumavgpric)
            ##temp_room에서 @hid, '', @thisrdate, room_id, '', @rmnum, 가격, 0, 0, 0을 선택하세요. 여기서 info_id = @infoid
            
            -- 객실 수가 계산된 평균 가격에 도달했습니다
            세트 @thisrnum = @thisrnum + @rmnum;
            IF (@thisrnum = @roomnum)
            시작
                -- 날짜를 기준으로 계산된 호텔별 총 가격
                업데이트 ##temp_result SET DSUMPRICE=(SELECT SUM(room_num*룸가격) ##temp_result TR에서 tr.hotel_id=@hid 그리고 TR.[ 날짜]=@thisrdate) 여기서 hotel_id=@hid 그리고 [날짜]=@thisrdate
                -- 호텔별 평균 객실 요금, 날짜별 총 가격 계산
                업데이트 ##temp_result DAVGPRICE=(dsumprice/@roomnum) 여기서 hotel_id=@hid [DATE]=@thisrdate
            끝
        끝

        @my_cursor2에서 @infoid로 다음 가져오기;
    끝   
    @my_cursor2 가깝습니다;  --커서 꺼
    딜로스@my_cursor2;   --커서 해제

    -- 호텔별로, 총 호텔 가격을 계산하세요
    업데이트 ##temp_result SUMPRIC=(SELECT SUM(room_num*객실 가격) ##temp_result TR 중 tr.hotel_id=@hid) 여기서 hotel_id=@hid
    -- 호텔 전체 객실의 평균 일일 요금을 계산합니다
    업데이트 ##temp_result SUMAVGPRIC=(sumpric/@roomnum/@days) 여기서 hotel_id=@hid

    my_cursor에서 @hid로 다음 페치(FETCH) - 다음 커서로 가세요, 데드루프 없음
끝  
닫my_cursor -- 커서를 닫으세요
디로my_cursor - 커서를 놓기


-- 임시 테이블에 호텔 이름과 객실 유형 이름을 추가하세요
업데이트 ##temp_result 세트 hotel_name=(dbo.hotel ht에서 ht.hotel_name 선택 WHERE ht.hotel_id=##temp_result.hotel_id),
room_name=(dbo.room_type rt에서 rt.room_name 선택 rt.room_id=##temp_result.room_id)


-- 결과 표에서 결과를 확인하세요
##temp_result에서 선택 *




-- 임시 테이블 정리 종료
만약 EXISTS(tempdb.dbo.sysobjects 중에서 * 선택, 여기서 id = object_id(N'tempdb.. ##temp_hotel') 그리고 type='U')
시작
    드롭 테이블 ##temp_hotel

만약 EXISTS(tempdb.dbo.sysobjects 중에서 * 선택, 여기서 id = object_id(N'tempdb.. ##temp_room') 그리고 type='U')
시작
    테이블 드롭 ##temp_room

만약 EXISTS(tempdb.dbo.sysobjects 중에서 * 선택, 여기서 id = object_id(N'tempdb.. ##temp_result') 그리고 type='U')
시작
    드롭 테이블 ##temp_result


점수

참가자 수1MB+1 기여하다+1 무너지다 이유
관리자 + 1 + 1 다른 사람을 돕는 데 열정적입니다!

모든 평점 보기

 집주인| 게시됨 2018. 12. 6. 오후 2:11:48 |
xzxmustwin 2018-12-6 11:58에 게시됨
솔직히 이 표의 구조는 다소 비합리적입니다

emmmm 데이터베이스 선생님이 내주는 숙제 문제는 정말 무리할 수도 있고, 제가 잘 배우지 않으면 그걸 못 봤어요...
하지만 핵심은 여전히 문제 해결 아이디어입니다. 친구들에게 조언이 있는지 묻고 싶습니다.
 집주인| 게시됨 2018. 12. 6. 오후 2:09:20 |
LZZSF가 2018-12-6 09:07에 게시됨
MySQL은 구식이고, 클라이언트도 없으니 SQL Server 스크립트를 주세요

죄송합니다, 아직 SQL Sever를 사용해본 적이 없어요. 아마도 그냥 가르치는 용도라서 선생님께서 mysql을 사용하라고 하셨거든요. 친구분들이 아이디어를 나눠주실 수 있다면 정말 감사합니다.
게시됨 2018. 12. 5. 오후 9:57:13 |
QQ 그룹에 가서 10위안의 보상금을 제안할게요. 누군가 도와줄 수 있는지 확인해볼게요
게시됨 2018. 12. 6. 오전 7:56:39 |
도움말
게시됨 2018. 12. 6. 오전 9:07:08 |
MySQL은 구식이고, 클라이언트도 없으니 SQL Server 스크립트를 주세요

점수

참가자 수1MB+1 기여하다+1 무너지다 이유
관리자 + 1 + 1 정말 열정적이네요!

모든 평점 보기

게시됨 2018. 12. 6. 오전 11:24:25 |
LZZSF가 2018-12-6 09:07에 게시됨
MySQL은 구식이고, 클라이언트도 없으니 SQL Server 스크립트를 주세요

아이디어에 대해 이야기하고 집주인이 참고 자료로 사용할 수 있도록 하는 것이 권장되며, 이것도 가능할 것입니다
게시됨 2018. 12. 6. 오전 11:58:37 |
솔직히 이 표의 구조는 다소 비합리적입니다

점수

참가자 수1MB+1 기여하다+1 무너지다 이유
관리자 + 1 + 1 정말 열정적이네요!

모든 평점 보기

 집주인| 게시됨 2018. 12. 6. 오후 2:07:29 |
2018-12-5 21:57에 게시됨
QQ 그룹에 가서 10위안의 보상금을 제안할게요. 누군가 도와줄 수 있는지 확인해볼게요

감사합니다. 답변해주실 분이 있다면 빨간 봉투를 보내드릴게요:)
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com