2016-06-17 3 views
2

호텔 이름과 월별 총 숙박 수와 평균 숙박 시간을 보여주는 SQL Server 스크립트를 작성하려고합니다. 어떤 도움을 주시면 감사하겠습니다. ,호텔 이름과 월별 도착 총 숙박 수와 평균 체류 기간

는 지금까지 "월"은 간다 :

HOTEL: 

HotelID (PK), HotelName, HotelAddress, HotelCity, HotelState, HotelPostalCode 

RESERVATION: 

ReservationID (PK), GuestID, RoomID (FK), CheckinDate, NumberofNights 

ROOM (Only needed for table joins): 

RoomID (PK), HotelID (FK) 

편집 : 여기에 몇 가지 관련 테이블의 정보가의

HotelName   Month  TotalArrivals  AvgLengthofStay 
============================================================== 
Algonquin Hotel June  300    4.25 
Algonquin Hotel July  375    3.65 
The Four Seasons June  485    4.45  
The Four Seasons July  445    4.10 
The Ritz-Carlton June  ...    ... 

:

는 여기에 내가 찾고 있어요 출력 유형의 나는 체크 아웃 날짜가 아닌 데이트 체크에 해당하는 달까지 엄격히 지낼 것입니다.

+1

'GROUP BY' 및 집계 함수 (예 : 'COUNT' 및'AVG')를 사용하십시오. – ZLK

+0

'CheckinDate'가 2016-05-31이고'NumberofNights'가 2이면 어떨까요? – Blank

+0

체크인 날짜가 월말 일 수 있으므로 다음 달에 들어갈 수있을만큼 정확하게 예측할 수 없습니다. 너는 그 때 무엇을 할 것인가? – Apostolos

답변

0

select 문 (SUM, AVG, COUNT 등)에서 집계 함수를 사용할 때 집계되지 않은 열을 기준으로 문을 그룹화해야합니다. 선택한 각 집계되지 않은 열은 집계 된 열을 자세히 세분화합니다.

SELECT HotelName, 
     SUM(TotalArrivals) AS TotalArrivals, 
     AVG(AvgLengthofStay) AS AvgLengthofStay 
FROM dbo.Table 
GROUP BY HotelName 

이 문장은 테이블의 삶의 시작부터 당신에게 도착 및 호텔마다 숙박 전체 평균 길이의 총계를 줄 것이다.

SELECT HotelName, 
     Month, 
     SUM(TotalArrivals) AS TotalArrivals, 
     AVG(AvgLengthofStay) AS AvgLengthofStay 
FROM dbo.Table 
GROUP BY HotelName, Month 

월 열을 추가하면 집계가 더 이상 중단됩니다. 이제 데이터는 호텔 도착 총 체류 시간과 평균 체류 시간을 월 단위로 표시합니다.

2
CREATE TABLE #Hotels 
(HotelID int, HotelName varchar(10), HotelAddress varchar(10), HotelCity varchar(10), HotelState varchar(10), HotelPostalCode varchar(10)) 

CREATE TABLE #Reservation 
(
ReservationID int, GuestID int, RoomID int, CheckinDate datetime, NumberofNights int 
) 

CREATE TABLE #Room 
(
RoomID int, HotelID int 

) 


INSERT INTO #Hotels (HotelID,HotelName) VALUES (1,'A') 
INSERT INTO #Hotels (HotelID,HotelName) VALUES (2,'B') 


GO 


INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (1,1,1,'2016-01-05',5) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (2,2,1,'2016-08-05',3) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (3,3,1,'2016-06-05',2) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (4,1,1,'2016-01-12',1) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (5,2,1,'2016-08-18',8) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (6,3,1,'2016-06-30',7) 





INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (1,1,2,'2016-02-01',5) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (2,2,2,'2016-02-06',3) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (3,3,2,'2016-02-09',2) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (4,1,2,'2016-04-03',1) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (5,2,2,'2016-04-07',8) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (6,3,2,'2016-04-05',7) 


INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (1,1,3,'2016-07-01',15) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (2,2,3,'2016-11-06',2) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (3,3,3,'2016-11-09',9) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (4,1,3,'2016-12-03',8) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (5,2,3,'2016-06-07',10) 
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights) 
VALUES (6,3,3,'2016-04-05',2) 



INSERT INTO #Room VALUES (1,1) 
INSERT INTO #Room VALUES (2,1) 
INSERT INTO #Room VALUES (3,2) 

하고 "마법"여기에 당신에게 한 달에 기본 행을 줄 것이다 HotelID 및 MONTH (re.CheckinDate)에 의해

SELECT HotelName, MONTH(re.CheckinDate) as Month, COUNT(*) as TotalArrivals, AVG(CAST(re.NumberofNights as decimal(22,6))) AS Avg 
FROM #Hotels h 
join #Room r on r.HotelID = h.HotelID 
join #Reservation re on re.RoomID = r.RoomID 
GROUP BY h.HotelID, HotelName, MONTH(re.CheckinDate) 
당신이 선택을 사용한다 무엇을해야

및 그룹 (각 호텔에 대해 12 행을 얻을 것입니다). COUNT (*)를 사용하면 특정 호텔에 대해 한 달 동안 모든 기록을 가져 오며 총 도착 수를 표시하며 평균 (NumberofNights)을 사용하면 평균 숙박 수를 알 수 있습니다.

또한 NumberofNights가 int 인 경우 regeNumberofNights를 사용하므로 평균은 3 개의 도착과 10 일 동안 int를 반환하므로 3을 반환합니다. 3.333333하지 않음.

희망이 있습니다.

+0

가 투표했습니다. 나 자신을 바로 잡을 시간이 없었어. 좋은 직장 동료 – Apostolos

+0

감사합니다, CiucaS! 이 하나가 정말 가까운 것 같습니다! 올바르게 작동하지 않는 유일한 것은 "TotalArrivals"입니다. COUNT (*)가 정확한 합계를 제공하지 않습니다. 기본적으로 호텔 이름과 월별 총 예약 건수를 찾고 있습니다. COUNT (re.ReservationID)를 시도했지만 그 중 하나가 작동하지 않는 것 같습니다. 어떤 아이디어? –

+0

@ amaidie90 일부 샘플 데이터를 게시하므로 함께 작업 할 수 있습니다. 이 이론이 작동해야합니다. – CiucaS

1

는 SQL SELECT 문 다음 확인하시기 바랍니다

;with cte as (
select 
    h.HotelID, 
    h.HotelName, 
    r.ReservationID, 
    DATENAME(mm,r.CheckinDate) as [month], 
    r.NumberofNights * 1.0 as NumberofNights 
from hotel h 
inner join ROOM o on o.HotelID = h.HotelID 
left join RESERVATION r on r.RoomID = o.RoomID and r.CheckinDate between '20160101' and '20161231' 
) 
select distinct 
    HotelName, 
    [month], 
    COUNT(ReservationID) over (partition by HotelID, [month]) TotalArrivals, 
    cast (AVG(NumberofNights) over (partition by HotelID, [month]) as decimal(10,2)) AvgLengthofStay 
from cte 

난 당신이 SUM과 같은 applying OVER and PARTITION BY clause to SQL mathematical functions()는 선택 문 이상으로 중요한 것이 무엇인지 사실은 T-SQL 개발자로 SQL CTE (Common Table Expression)

을 잘 알고있는 가정, COUNT(), AVG() 등

평균 체류 시간을 10 진수로 표시하려면 숙박 일수에 1.0을 곱해야했습니다. 마지막 단계에서 정수 부분 뒤에 소수점을 2 포인트로 변환합니다.

해결책을 찾는데 도움이 되었기를 바랍니다.