MySQL разделил предложение groupBy на несколько столбцов

0

Мое знание сложных запросов MySQL не очень хорошо, и у меня возникают проблемы с поиском или даже формулировкой этого вопроса.

У меня есть таблица, которая выглядит следующим образом. Изображение 174551

У меня есть запрос, который подсчитывает все строки, где "type = student", а затем группирует их по годам и месяцам, для которых я использую created_column. Это довольно просто.

Запрос выглядит следующим образом:

SELECT YEAR(created_at) as year, MONTH(created_at) as month, COUNT(type) as student_count
FROM users
WHERE type = "student"
GROUP BY year, month
ORDER BY year, month

Теперь мне нужно добавить еще 2 столбца: "подписка" и "pay_per_video", которая будет делить общее количество за каждый месяц и год на тип уровня ученика либо "подписка", либо "pay_per_video". Например. если в январе 2017 года зарегистрировано в общей сложности 20 студентов. 12 могут быть учениками per_per_video, а 8 в этом месяце были учениками подписки. Любые указатели приветствуются.

UPDATE Я ищу что-то вроде этого: Таблица: Subject_Selection

Year    Month       Student Count     Pay Per View     Subscription
--------------------------------------------------------------------
2016     12              20                 20               0
2017     1               23                 12              11
2017     2               30                 10              20
2017     3                2                  1               1
2017     4               12                  2              10
2017     5               90                 40              50
2017     6               12                  0              12
  • 0
    Привет, я бы посоветовал сначала нормализовать (так как много информации повторяется) базы данных, чтобы вам было проще выполнить несколько простых запросов. Также для подсчета я бы посоветовал использовать процедуру / триггер для автоматического подсчета каждый раз, когда у вас есть новая запись.
  • 0
    Я обновил вопрос о том, какую структуру я ищу.
Теги:
database

3 ответа

2
Лучший ответ

Используйте условную агрегацию, как показано ниже:

SELECT YEAR(created_at) as year, MONTH(created_at) as month, COUNT(type) as student_count,
count(case when student_level='subscription' then 1 end) as subscriptioncount,
count(case when student_level='pay_per_vedio' then 1 end) as pay_per_vediocount
FROM users
WHERE type = "student"
GROUP BY year, month
ORDER BY year, month
  • 0
    Пожалуйста, посмотрите на мое обновление.
  • 0
    эй, мой ответ уже учтен, просто выполните запрос и посмотрите, что получится
Показать ещё 4 комментария
0

Теперь мне нужно добавить еще 2 столбца: "подписка" и "pay_per_video", которая будет делить общее количество за каждый месяц и год на тип уровня ученика либо "подписка", либо "pay_per_video".

Здесь я предлагаю вам просто добавить один столбец с именем вроде level_type, в котором будет храниться либо подписка OR 'pay_per_video' как значение.

делая это, ваш SQL будет оптимизирован,

SELECT year, month, COUNT(student_count), level_type FROM (SELECT YEAR(created_at) as year, MONTH(created_at) as month, COUNT(type) as student_count
FROM users
WHERE type = "student"
GROUP BY year, month
ORDER BY year, month) as s
GROUP BY level_type
0

Ниже вы найдете запрос для ваших нужд. Надеюсь, он будет выполнен, как вы пожелаете.

SELECT YEAR(created_at) as year, MONTH(created_at) as month, student_level, 
COUNT(type) as student_count
FROM users
WHERE type = "student"
GROUP BY year, month, student_level
ORDER BY year, month, student_level

Ещё вопросы

Сообщество Overcoder
Наверх
Меню