如何编写一个sql语句,返回过去12个月中每个students
有lessons
的列表?
所以我希望输出类似于:
+--------+----------------+
| Month | No of Students |
+--------+----------------+
| Oct 08 | 12 |
| ... | ... |
| ... | ... |
| Sep 09 | 15 |
+-------------------------+
编辑:相关架构 -
lessons{student_id:INT, time:DATE}
student{id:INT, person_id:INT}
学生可以在一个月内参加任意数量的课程,所以我对一个月内有多少课程感兴趣,但是那个月有多少学生上过课
答案 0 :(得分:2)
CREATE TABLE tmp (student_id int(10), month int(4), year int(4));
INSERT INTO tmp
SELECT DISTINCT student.id, MONTH(time), YEAR(time)
FROM lessons INNER JOIN student ON lessons.student_id = student.id
WHERE PERIOD_ADD(time,12) > NOW();
SELECT count(*) FROM tmp
GROUP BY MONTH(month), YEAR(year);
DROP TABLE tmp;
答案 1 :(得分:2)
您可以在date_format
内使用group by
来获得您想要的结果,因为您只想做count distinct
。
select
date_format(`time`, '%b %y') as `Month`,
count(distinct student_id) as NumberOfStudents
from
lessons
where
`time` >= date_add(date_add(current_date interval -12 months)
interval (-1)*(day(current_date)+1) days)
group by
date_format(`time`, '%b %y')
如果一个student_id
可以有多个person_id
,而您真正感兴趣的是唯一person_id
的计数,那么您可以做到这一点:
select
date_format(l.`time`, '%b %y') as `Month`,
count(distinct s.person_id) as NumberOfPeople
from
lessons l
inner join students s on
l.student_id = s.id
where
l.`time` >= dateadd(dateadd(current_date interval -12 months)
interval (-1)*(day(current_date)+1) days)
group by
date_format(l.`time`, '%b %y')