팀프로젝트로 게스트하우스 사이트를 만들고 있습니다.
6명이 들어갈 수 있는 방 A가 있다고 가정하면
하루하루 예약상황에 따라
1/15일은 3명만 예약가능
1/16일은 한명 체크아웃해서 4명 예약가능
1/17일은 두명 체크인해서 2명만 예약가능
이런식으로 하루하루 예약가능 상황을 체크해야하는데요
이 내용을 처리할 때 어떤식으로 보통 진행하시나요??
강사님은 한 컬럼에 콤마 구분자를 써라
아니면 A방의 6개월치의 예약가능인원 테이블을 만들어라
라고 하시는데, 정확히 어떤 얘기인지는 모르겠습니다.
힌트라도 주시면 찾아보도록 하겠습니다. 읽어주셔서 감사합니다~
-----
Input - 검색한 체크인 날짜&체크아웃 날짜&예약할 인원수
Output - 검색된 날짜 안에서 예약할 인원수보다 자리가 많은 방을 하나라도 가지고있는 게스트하우스를 뽑아내어 정렬
단순하게 가려면
예약 테이블 - 날짜 , 게스트하우스번호, 방번호, 회원번호
게스트룸 테이블 - 게스트하우스번호 , 방번호, 수용인원
이런식으로 구성될것 같은데요.
SELECT A.게스트하우스 번호 , A.방번호 , COUNT(*) 예약인원 , MAX(B.수용인원) - COUNT(*) 남는 수용인원
FROM 예약테이블 A
, 게스트룸 테이블 B
WHERE A.게스트하우스번호 = B.게스트하우스번호
AND A.방번호 = B.방번호
AND 날짜 BETWEEN 체크인날짜 AND 체크아웃날짜
GROUP BY A.게스트하우스 번호 , A.방번호
HAVING MAX(B.수용인원) - COUNT(*) > 0
-- 달력 테이블 하나 만들어 사용하시면 편리합니다. SELECT b.방코드 , b.방이름 , b.수용인원 , a.일자 , SUM(c.예약인원수) AS 예약인원수 , b.수용인원 - NVL(SUM(c.예약인원수), 0) AS 예약가능인원 FROM 달력 a CROSS JOIN 방 b LEFT OUTER JOIN 예약정보 c ON b.방코드 = c.방코드 AND a.일자 BETWEEN c.입실예정일 AND c.퇴실예정일 WHERE a.일자 BETWEEN :입실예정일 AND :퇴실예정일 GROUP BY b.방코드, b.방이름, b.수용인원, a.일자 HAVING b.수용인원 - NVL(SUM(c.예약인원수), 0) >= :예약인원수 ;
-- 조건 추가 -- SELECT b.방코드 , b.방이름 , b.수용인원 , a.일자 , SUM(c.예약인원수) AS 예약인원수 , b.수용인원 - NVL(SUM(c.예약인원수), 0) AS 예약가능인원 FROM (SELECT 일자 FROM 달력 WHERE 일자 BETWEEN :입실예정일 AND :퇴실예정일 ) a CROSS JOIN (SELECT x.방코드, x.방이름, x.수용인원 FROM 방 x INNER JOIN 게스트하우스 y ON x.게스트하우스코드 = y.게스트하우스코드 WHERE 1=1 AND -- 각종 조건들 -- ) b LEFT OUTER JOIN 예약정보 c ON b.방코드 = c.방코드 AND a.일자 BETWEEN c.입실예정일 AND c.퇴실예정일 GROUP BY b.방코드, b.방이름, b.수용인원, a.일자 HAVING b.수용인원 - NVL(SUM(c.예약인원수), 0) >= :예약인원수 ;
1. 날짜 테이블 만들기 참고 - http://nekomimi.tistory.com/722
2. 샘플데이터 넣기
- 회원테이블
- 게스트하우스 테이블
- 방테이블
- 예약정보테이블
3. 답변주신 ORACLE SQL을 MySQL로 조금 수정
(2018-01-12 ~ 2018-01-14) 2명 검색한 경우
select b.roomcode, b.roomname, b.capacity, a.d, sum(c.bookingnumber) as "예약인원수" , b.capacity - ifnull(sum(c.bookingnumber),0) as "예약가능인원" from (select d from date_t where d between '2018-01-12' and '2018-01-14' ) a cross join (select x.roomcode, x.roomname, x.capacity from room_tb x inner join guest_tb y on x.guesthousecode = y.guesthousecode where 1=1 ) b left outer join booking_tb c on b.roomcode = c.roomcode and a.d between c.bookingstart and c.bookingend group by b.roomcode, b.roomname, b.capacity, a.d having b.capacity - ifnull(SUM(c.bookingnumber),0) >= 2;
1. 날짜 테이블 만들기 참고 - http://gurubee.net/article/65315
2. 알리아스에 홑따옴표 사용은 표준이 아닙니다. ==> 쌍따옴표 사용하세요.