Intereting Posts
Мне нужно объявление DOCTYPE в php-файле с html? Неустранимая ошибка: вызов неопределенной функции mysqli_result () Бесконечный цикл перенаправления WordPress wp-admin Объяснение примера PHP ini_set php.net display_errors Стандартная практика обнаружения мобильных устройств и страниц подачи в PHP и jQuery Отправка значений latlng в mysql-запрос для обновления маркеров Google Maps через routeboxer Как поток PHP хранит свои данные? Случайные URL-адреса PHP (короткий URL) Выберите невозможное значение в выбранных входах с помощью Symfony DomCrawler Zend Date DST Bug: проверьте, является ли дата «датой изменения времени» Шаблон WordPress вызывает ошибку 404 PHP-код может вставить изображение в файл excel и правильно его открыть в MS Excel? Как получить каждый 15-й и последний день месяца в PHP Magento: установка представления хранилища по умолчанию для групп клиентов Команды не синхронизируются при вызове хранимой процедуры Mysql

Отображать динамические диапазоны из таблицы базы данных и подсчитывать строки в каждом диапазоне

У меня есть таблица базы данных:

введите описание изображения здесь

Я хочу показать разные пятилетние возрастные диапазоны и количество студентов, которые находятся в этом диапазоне, как показано ниже:

введите описание изображения здесь

Здесь самый низкий возраст – 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
  • 5 больше этой переменной.

Я сделал это, изменив значение @a по мере необходимости:

  • @a: = (SELECT MIN (возраст) FROM myTable WHERE age> = @a)
  • @a: = @a + 5

Затем я включил их в блок 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