이 게시물은 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 끝
|