2012-06-22 2 views
1

Я пытаюсь объединить 2 sql-запроса в одном запросе.Присоединение к 2 sql-запросам в MySQL

Первый получает количество номеров в отеле. Второй получает количество проверенных гостей в отеле. Я пытаюсь получить уровень занятости в отеле.

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

UNION ALL ..... –

+0

с соединением он просто добавляет. Но я хотел бы разделить эти 2 подсчета и получить процент – 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, и что в гостиничном номере будет только 0 или 1 соответствующих строк в таблице room_reservation, как указано в предыдущем Бронирование для помещения будут удалены (это так кажется, потому что в вашем втором запросе, вы не делаете какой-либо фильтрации, как выбрать только самые последние резервирование за номер и т.д.):

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.

Смежные вопросы