#mysql #sql #heidisql
#mysql #sql #heidisql
Вопрос:
Я пытаюсь реализовать запрос, который выдает мне сумму наиболее выгодных номеров в каждом отеле (25 отелей).
Ниже приведен мой запрос:
SELECT hotels.hotel_id,rooms.room_id,hotel_name,room_number,sum(rooms.room_price) AS profit,COUNT(rooms.room_id) AS count
FROM hotels,rooms,bookings
WHERE hotels.hotel_id=rooms.hotel_id
AND rooms.room_id=bookings.room_id
GROUP BY rooms.room_id
и это самый близкий результат, который я получил.. игнорируйте язык названия отеля
Это результат, которого я достиг на данный момент,
бронирование стр.2 (оставшиеся записи)
hotel_id 1 содержит 5 номеров, room_number 300 принес наибольшую прибыль. Я хочу показать наибольшую прибыль только для каждого отеля. Мне не нужны другие номера, которые принесли меньшую прибыль.
Обновление: Итак, я решил аналогичный запрос, в котором я хочу получить 2 лучших номера, которые принесли наибольшую прибыль. Но я просто не могу придумать ни одной функции, которая могла бы дать мне только максимальную прибыль для каждого отеля. небольшая подсказка или справка были бы оценены
Комментарии:
1. Попробуйте отредактировать свою группировку в
GROUP BY hotels.hotels_id,rooms.room_id
и посмотрите, это то, что вы хотите2. @tcadidot0 попытался
GROUP BY hotels.hotels_id
, и это дало мне сумму всех из них «4500 1200 2500 …». Но что мне нужно, так это игнорировать всю прибыль и брать только 4500, потому что я хочу только самую высокую. Я также попыталсяGROUP BY hotels.hotels_id,rooms.room_id
написать все это, и результат был таким же, как и раньше3. Мой плохой @Aymsul. Я еще раз взгляну на ваши примерные данные и попытаюсь дать правильный ответ.
Ответ №1:
Попробуйте этот запрос:
SELECT * FROM
(SELECT hotels.hotel_id,rooms.room_id,hotel_name,room_number,SUM(rooms.room_price) AS profit,COUNT(rooms.room_id) AS COUNT
FROM hotels,rooms,bookings
WHERE hotels.hotel_id=rooms.hotel_id
AND rooms.room_id=bookings.room_id
GROUP BY rooms.room_id) a GROUP BY hotel_id;
Редактировать:
Это может сделать это:
SELECT hotel_id,room_id,room_number,MAX(a.tc) AS "Count",MAX(tp) AS "MostProfit" FROM
(SELECT hotel_id,rooms.room_id,room_number,COUNT(rooms.room_id) AS "tc",SUM(room_price) AS "tp" FROM rooms JOIN bookings
ON rooms.room_id=bookings.room_id
GROUP BY rooms.room_id) a GROUP BY hotel_id
Комментарии:
1. Этот код почти идеален, за исключением того, что он получает только первую запись каждого отеля, а не самую высокую прибыль, пытался выполнить order by, но это бессмысленно. спасибо за попытку помочь, я попробую отредактировать код, который вы мне дали после работы. если я найду решение, я опубликую его здесь
2. Я понял то же самое @Aymsul . Я все еще работаю над выполнением вашего условия. Если я смогу, я также обновлю свой ответ.
3. но не могли бы вы объяснить, почему вы использовали double select и
GROUP BY rooms.room_id) a GROUP BY hotel_id
и эти две group by , я просто не понимаю. Никогда не использовал подобный запрос4. Запрос внутри
(SELECT hotel_id,rooms.room_id,room_number,COUNT(rooms.room_id) AS "tc" ... ) a
называется подзапросом. В этом подзапросе я возвращаюCOUNT(rooms.room_id) AS "tc",SUM(room_price) AS "tp"
значение по номеру, следовательно,... GROUP BY rooms.room_id) a
используется в подзапросе. Затем я пишу другой запрос, чтобы вернуть максимумtc
иtp
значениеGROUP BY hotel_id
из самого подзапроса.5. Чтобы было проще понять, второй запрос (внешний запрос) предназначен только для того, чтобы конкретно возвращать максимальное значение вашего начального запроса [
sum(rooms.room_price) AS profit,COUNT(rooms.room_id) AS count
] value.
Ответ №2:
Пожалуйста, попробуйте ниже один раз:
SELECT RO_BOOK.HOTEL_ID,
RO_BOOK.ROOM_ID,
RO_BOOK.ROOM_NUMBER,
RO_BOOK.TOTAL_BOOKINGS,
MAX(RO_BOOK.TOTAL_EARNINGS) PROFITS
FROM(
SELECT ROOMS.HOTEL_ID
ROOMS.ROOM_ID,
ROOMS.ROOM_NUMBER,
COUNT(ROOMS.ROOM_ID) TOTAL_BOOKINGS
SUM(ROOMS.ROOM_PRICE) TOTAL_EARNINGS
FROM
ROOMS, BOOKINGS
WHERE
BOOKINGS.ROOM_ID = ROOMS.ROOM_ID
GROUP BY ROOMS.ROOM_ID) RO_BOOK
GROUP BY RO_BOOK.HOTEL_ID ;
Это похоже на код @tcadidot0, но максимум столбца (a.tc ) КАК «Count» возвращает максимальное количество независимо от ROOM_ID.
Например:
если в отеле 1 есть 2 номера, скажем, R100 и R200. Стоимость R100 равна 1000, а R200 равна 100.
Число раз, когда R100 забронировано, не равно 1, а R200 равно 3.
Таким образом, запрос вернул бы:
ОТЕЛЬ 1, R100, КОЛИЧЕСТВО 2, ПРИБЫЛЬ 1000.
Пожалуйста, поправьте меня, если я неправильно понял вопрос.
Комментарии:
1. извините,, я загрузил их