2012-06-22 120 views
1

我試圖在一個查詢中加入2個sql查詢。在MySQL中加入2個sql查詢

第一個獲得每間酒店的客房數量。 第二個獲取酒店中已檢查客人的人數。 我正試圖獲得每家酒店的入住率。

SELECT hotel_id, count(room_id) 
FROM room 
group by room.hotel_id 

SELECT h.hotel_id, count(k.room_id) 
FROM room_reservation as kr , room as k , hotel as h 
where kr.room_id = k.room_id and k.hotel_id = h.hotel_id 
group by k.hotel_id 

我該怎麼做?

+2

聯盟所有..... –

+0

與聯盟它只是增加。但我想分這兩個計數,並得到百分比 – fatih

+0

什麼是入住率? '客人數'/'所有客房','客人數量'''客房數量''或'客房數量'/'所有客房'? – Aprillion

回答

0

你絕對可以用一個查詢做到這一點。一種方法就是將你的查詢結合在一起。

不過,我覺得有以下做了你一舉想要的東西:

SELECT r.hotel_id, count(distinct k.room_id) as numrooms, 
     count(distinct kr.room_id) as numreserved 
FROM room k left outer join 
    room_reservation kr 
    on kr.room_id = k.room_id 
group by r.hotel_id 

我不積極,不知道更多有關表格。特別是,預訂有一個時間部分,房間和酒店都沒有。這如何納入您的查詢?

+0

如果'kr.room_id = k.room_id',您將得到相同的不同計數... – Aprillion

+1

這是一個左外連接。有些情況下沒有預訂房間。 –

+0

好點,我想我們需要一個更好的入住率定義(*客人數/所有客房*或*佔用客房數/所有客房*) – Aprillion

1
select aux.hotel_id, ((coalesce(aux2.total, 0)*1.0)/aux.total)*100 as 'ocupancy rate' 
from (SELECT hotel_id, count(room_id) as 'total' 
     FROM room 
     group by room.hotel_id) aux 
LEFT OUTER JOIN (SELECT h.hotel_id, COUNT(k.room_id) as 'total' 
       FROM room_reservation as kr 
       INNER JOIN room as k ON (kr.room_id = k.room_id) 
       INNER JOIN hotel as h ON (k.hotel_id = h.hotel_id) 
       GROUP BY k.hotel_id) aux2 on aux.hotel_id = aux2.hotel_id 
+0

您是如何從每個酒店獲得入住率的? – Aprillion

+0

@deathApril剛剛閱讀標題,回答編輯:) –

0

我希望這是不言自明:

select hotel_id, sum(guests)/count(room_id) occupancy_level 
from (
    select r.hotel_id, r.room_id, count(*) guests 
    from room r 
    left join room_reservation rr on rr.room_id = r.room_id 
    group by r.hotel_id, r.room_id 
) temp 
group by hotel_id 

UPDATE - 由@Gordon Linoff啓發,包括毫無保留的房間

select r.hotel_id, count(*)/count(distinct r.room_id) occupancy_level 
from room r 
left join room_reservation rr on rr.room_id = r.room_id 
group by r.hotel_id, r.room_id 
0

加入您所有的疑問,彙總得到每間酒店房間數/預訂數,以及劃分:

SELECT hotel_id, 
    COUNT(DISTINCT r.room_id)/CONVERT(decimal, COUNT(*)) * 100.0 AS occupancy_rate 
FROM hotel h 
    LEFT OUTER JOIN room r ON h.hotel_id = r.hotel_id 
    LEFT OUTER JOIN room_reservation rr ON r.room_id = rr.room_id 
GROUP BY h.hotel_id 
+0

更多預訂=>較小的入住率? – Aprillion

+0

謝謝,我試圖加入where子句,但答案是使用左外連接 – fatih

0

假設在room_reservation表中的任何給定時間總是會有等於或少於總酒店房間的預訂,並且酒店房間在room_reservation表中將只有0或1個對應行,這可以很簡單地完成預訂的房間被刪除(看起來是這樣,因爲在你的第二個查詢,你沒有做任何過濾的像只選擇每間房最近預訂等):

SELECT 
    a.hotel_id, 
    (COUNT(b.room_id)/COUNT(*))*100 AS occupancy_rate 
FROM 
    room a 
LEFT JOIN 
    room_reservation b ON a.room_id = b.room_id 
GROUP BY 
    a.hotel_id 

如果您需要更多除了hotel_id之外的酒店詳情,將需要額外的INNER JOIN