#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
столбец будет отображаться в виде числа с плавающей запятой с тремя десятичными знаками. Как я могу удалить десятичные разряды?