MySQL数据库查询问题,高分求解.

现在有一个表如下
id name sign_date class
1 张三 2012-11-13 1
2 李四 2012-11-13 1
3 王五 null 2
4 无名氏 null 2
现在想用一条sql语句查询,把学生按照class进行分组,求出学生的签到数跟签到率.
比如这个表,得出的结果应该是两个结果集,第一个是class为1的,里面包含3个信息分别是班级 签到人数 签到率{1,2,100%}第二个结果集是class为2的,{2,0,0%}
如题,求解.

知识点:
group by 汇总函数
sum/count函数
难点:
多条件汇总
答案:
%百分比,不要在sql中求,建议你用php取到结果,再算。
SELECT class,SUM(id), FROM 你的表名GROUP BY class,sign_date
其他:
你的json不是这样用的。要用php得到结果后,再用php_json来输出json格式。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-13
你这个签到率算不出来啊,看不到某个班级的学生总人数。
签到数倒是可以算出来滴
SELECT
CLASS,
SIGN_DATE,
COUNT(*)
FROM
TABNAME
GROUP BY
CLASS,
SIGN_DATE
酱紫就可以看到某个班在某天的签到总人数鸟,但是班级人员的总人数你需要再想办法统计下,从签到表是看不出来滴。追问

签到人数可以求,签到总人数也可以.但是我现在想要一条sql直接求出来.
我想的是select class,count(id),concat(round(count(id)*100/count,2),'%') from table,(select count(*) as count from table group by class)t where sign_date is not null group by class
可是这样count(id)不仅查table表,还会查t表,最后总数都不对了.现在我又没法分开查询然后去除法,因为我需要一个list直接封进json

追答

额……理解一下阁下的意思
你是说你算的签到率是按照 某班签到人数/总签到人数 × 100%?
如果如此的话可以这样:
SELECT
CLASS,
SIGN_DATE,
COUNT(*) CLASSSIGN,
COUNT(*)/TEMP.ALL * 100 CLASSSIGNTOALL

FROM
TABLE,
(SELECT
SIGN_DATE,
COUNT(*) ALL
FROM
TABLE
GROUP BY
SIGN_DATE) TEMP
WHERE
TABLE.SIGN_DATE = TEMP.SIGN_DATE
GROUP BY
CLASS,
SIGN_DATE

第2个回答  2012-11-13
MSSQL的,自己转一下
SELECT T1.class, T2.NCOUNT, T3.SCOUNT/T2.NCOUNT AS 签到率 FROM
(SELECT DISCINT class FROM T)T1 --班级View
LEFT JOIN
(SELECT COUNT(T.name) AS NCOUNT, T.class
FROM T GROUP BY T.class)T2 --班级人数View
ON T1.class = T2.class
LEFT JOIN
(SELECT COUNT(T.sign_date) AS SCOUNT, T.class
FROM T GROUP BY T.class HAVING T.sign_date NOT NULL )T3 --签到人数View
ON T2.class = T3.class
第3个回答  2012-11-13
select class,count(sign_date) as 签到数,count(sign_date)/count(name) as 签到率 from table
group by class;本回答被提问者采纳
第4个回答  2012-11-13
select a.class,(b.qdrs) as '签到人数',
,b.qdrs/count(a.name) as '签到率'
from table a
inner join(select class,count(sign_date) as 'qdrs' from table where sign_date not null group by class)b on a.class=b.class
group by class
不好意思改了好几次追问

谢谢,问题已经解决了.原来别人写的是把sign_date当做条件去查询了,我一直沿用这个sql去写.现在换了个思路只分组然后count(sign_date)
签到:select class,count(sign_date) as sl,concat(round(count(sign_date)*100/count(*),2),'%') as qdl from table group by class
未签到:select class,(count(*)-count(sign_date)) as sl,concat(round(count(sign_date)*100/count(*),2),'%') as qdl from table group by class