У меня есть таблица базы данных:
Я хочу показать разные пятилетние возрастные диапазоны и количество студентов, которые находятся в этом диапазоне, как показано ниже:
Здесь самый низкий возраст – 10, поэтому мы сначала вычисляем диапазон 10-15. В этом диапазоне 5 студентов. Для второго диапазона нам нужно найти возраст> 15, который равен 18. Таким образом, второй диапазон составляет от 18 до 23 и так далее. Я был бы признателен за любую помощь, когда диапазон автоматически рассчитывается и подсчитывает данные в этом диапазоне.
Вы можете использовать условие внутри оператора SUM (), чтобы получить счетчик, в котором выполняется это условие. Я бы посчитал условия, когда возраст BETWEEN () необходимый диапазон. Попробуй это:
SELECT SUM(age BETWEEN 10 AND 15) AS '10-15', SUM(age BETWEEN 18 AND 23) AS '18-23', SUM(age BETWEEN 26 AND 31) AS '26-31', SUM(age BETWEEN 34 AND 39) AS '34-39' FROM myTable;
Это вернет только один ряд, но у него будет все, что вам нужно. Вот пример SQL Fiddle .
EDIT Я неправильно понял ваш вопрос, чтобы автоматически рассчитать различные диапазоны. Я оставлю свой предыдущий ответ здесь, потому что это может быть полезно для будущих читателей, ищущих жестко закодированные диапазоны. Для этого вам нужно будет настроить переменную. Я сделал своего рода подход с полным типом, чтобы получить группы. Я начал с установки @a до 0 перед запросом. Затем мне нужно было получить два значения:
Я сделал это, изменив значение @a по мере необходимости:
Затем я включил их в блок CONCAT()
и выбрал эти значения в виде символов, чтобы получить нужные мне группы. Это может выглядеть сложным, поэтому я надеюсь, что я объяснил концепцию:
SELECT CONCAT (CAST(@a := (SELECT MIN(age) FROM myTable WHERE age > @a) AS CHAR), ' - ', CAST((@a := @a + 5) AS CHAR)) AS ageRange FROM myTable WHERE @a <= (SELECT MAX(age) FROM myTable);
Это дало мне четыре ряда, каждый из которых вы ожидаете. Мне пришлось добавить предложение where, потому что в противном случае я бы получил одну строку результатов для каждой строки таблицы, что дало бы нам несколько нулевых строк.
Наконец, я включил подзапрос, чтобы получить количество студентов, возраст которых находится в пределах необходимого диапазона. Обратите внимание, что первая часть меняет значения @a, поэтому вместо проверки от @a до @a + 5 я проверяю от @ a-5 до @a. Вот окончательный запрос:
SET @a = 0; SELECT CONCAT(CAST(@a := (SELECT MIN(age) FROM myTable WHERE age > @a) AS CHAR), ' - ', CAST((@a := @a + 5) AS CHAR)) AS ageRange, (SELECT COUNT(*) FROM myTable WHERE age BETWEEN @a - 5 AND @a) AS numStudents FROM myTable WHERE @a <= (SELECT MAX(age) FROM myTable) GROUP BY ageRange;
Он отлично работал в SQL Fiddle . Полностью динамичный и возвращает различные группы из 5 без предварительного знания того, какие группы взять.
SELECT CASE WHEN age>=10 AND age<=15 THEN '10-15' WHEN age>=18 AND age<=23 THEN '18-23' WHEN age>=26 AND age<=31 THEN '26-31' WHEN age>=34 AND age<=39 THEN '34-39' ELSE 'OTHER' END AS age_range, COUNT(*) as number_of_students FROM table GROUP BY age_range