Мое знание сложных запросов MySQL не очень хорошо, и у меня возникают проблемы с поиском или даже формулировкой этого вопроса.
У меня есть таблица, которая выглядит следующим образом.
У меня есть запрос, который подсчитывает все строки, где "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
Используйте условную агрегацию, как показано ниже:
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
Теперь мне нужно добавить еще 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
Ниже вы найдете запрос для ваших нужд. Надеюсь, он будет выполнен, как вы пожелаете.
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