попытка получить номера отелей, которые получили наибольшую прибыль в запросе

#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

и это самый близкий результат, который я получил.. игнорируйте язык названия отеля

Это результат, которого я достиг на данный момент,

отели

номера

бронирование стр.1

бронирование стр.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. извините,, я загрузил их