2012-06-22 88 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