使用mysql生成统计信息

时间:2009-09-27 20:33:18

标签: sql mysql database

如何编写一个sql语句,返回过去12个月中每个studentslessons的列表?

所以我希望输出类似于:

+--------+----------------+
| Month  | No of Students |
+--------+----------------+
| Oct 08 |  12            |
| ...    |  ...           |
| ...    |  ...           |
| Sep 09 |  15            |
+-------------------------+

编辑:相关架构 -

lessons{student_id:INT, time:DATE}
student{id:INT, person_id:INT}

学生可以在一个月内参加任意数量的课程,所以我对一个月内有多少课程感兴趣,但是那个月有多少学生上过课

2 个答案:

答案 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')