Как я могу использовать подзапрос в результатах моего запроса, а затем упорядочить по вычисленному результату для каждой строки?

#mysql #sql

#mysql #sql

Вопрос:

Контекст

У меня возникли некоторые проблемы с объединением логики подзапросов (?) в моей голове.

    *---------*---------*---------*------------*------------*---------*
   |GUEST_ID | Country | County  | Attending  | Donation   | Party   |
   *---------*---------*---------*------------*------------*---------*
 

У меня есть база данных, содержащая записи о посетителях благотворительного бала.

GUEST_ID: ключ таблицы.
Страна: страна, из которой гость.
Округ: округ, из которого гость (т. Е. Регион в этой стране).
Посещаемость: посещает ли гость (т. Е. true или false).
Пожертвование: сумма, которую гость жертвует на дело.
Вечеринка: на какой вечеринке присутствует гость.

Цель

Я хочу отобразить таблицу с разбивкой по странам и округам, показывающую количество участников из каждой страны округа и среднее пожертвование тех, кто посещает из этой страны страны. Затем я хотел бы упорядочить строки от самого высокого среднего пожертвования до самого низкого. Я понимаю составные части этого запроса, однако я не уверен, как «склеить» его в целом.

Я могу GROUP BY Country, County .

Я могу SUM(Donation) .

Я могу COUNT(*) WHERE ATTENDING = 'Yes'

И я знаю, что могу SET @variables сохранять результаты в промежуточный период.

Я также знаю, что могу ORDER BY DESC .

Пока

Моя проблема заключается в понимании того, как объединить эти элементы в функционирующий запрос. Я предполагаю, что мне нужно использовать подзапросы, однако у меня возникают проблемы с правильным порядком. Это то, что у меня есть до сих пор —

 SELECT SUM(`Donation`) AS `TotalDonations`, `Country`, `County`  
FROM `GuestList` 
WHERE `Party` = `2014CharityBall`
GROUP BY `Country`, `County`
 

Я не уверен, как добавить подзапрос, чтобы найти COUNT только тех гостей, которые определенно посещают, или как вычислить TotalDonations / DefinitelyAttending, а затем ORDER BY это.

Требуются результаты

 *------------*------------*---------------*---------------*---------------*
| Country    | County     | # of Attendees|Total Donations|Avg. Donation  |
*------------*------------*---------------*---------------*---------------*
 

Страна: страна, из которой прибыли гости.
Округ: округ, из которого прибыли гости (т. Е. Регион в этой стране).
Количество участников: количество участников (посещаемость = ‘true’) в этой стране и округе.
Общее количество пожертвований: общее количество пожертвований всех участников (посещающих = ‘true’) в пределах этой страны и округа (например SUM(Donation) ).
Среднее пожертвование: среднее пожертвование всех участников (посещающих = ‘true’) в пределах этой страны и округа (например AVG(Donation) , то есть ofc, общее количество пожертвований / # участников).

Дополнительный кредит

Просто выражение 😉

Если я хочу рассчитать общее количество пожертвований среди всех жертвователей, приглашенных на вечеринку, и, отдельно, общее количество пожертвований исключительно среди тех жертвователей, которые посещают вечеринку, как мне это сделать?

Комментарии:

1. Да, извиняюсь. Я все еще новичок. Я добавлю правильный тег. Спасибо.

2. Просто чтобы ткнуть, вам также нужен общий итог по стране в том же наборе результатов?

3. @Serpiton Я добавил результаты, необходимые для моего вопроса

4. Отлично, но мой предыдущий вопрос был другим: вам также нужно общее количество по стране без учета округа?

5. Ах, да, извините, моя ошибка. Нет, мне не нужно для каждой страны 🙂

Ответ №1:

     SELECT `Country`, 
    `County`,
    SUM(`Donation`) AS `TotalDonations`,
    FORMAT(AVG(`Donation`), 0) AS `AVGDonations`,
    COUNT(1) Attending
    FROM `GuestList` 
    WHERE `Party` = `2014CharityBall`
           AND Attending = `Yes`
    GROUP BY `Country`, `County`
    Order by 4 desc
 

Комментарии:

1. Спасибо, я попробую это. Что такое ORDER BY 4 , пожалуйста? На что 4 ссылается `?

2. Это вернет SUM и AVG для всех, а не только для посещающих

3. @Eilidh, 4-й столбец в инструкции SELECT.

4. @Serpiton, ГРУППА BY должна заставить ее выполнять совокупные значения на уровне группы.

5. При этом AVGDonations столбец будет отображаться в виде числа с плавающей запятой с тремя десятичными знаками. Как я могу удалить десятичные разряды?