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

高分悬赏 mysql多表查询,并统计的问题
function getdata($i){ sql = "select id ,name from table2 where id =".$i;\/*mysql_connect();mysql_query();row = mysql_fetch_array();此部他请参考手册补全 \/ return $row;} formatRet = array();for($i = 1; $i< 1000; $i++){ \/\/将1000改成你数据库中最大的ID row ...

php+mysql数据查询语句问题,两张表user,msg【高分求解】
php$sql_str="select toid,fromId,info,max(addDate) as A_date from msg where toid=1 group fromid order by fromId "$con = mysql_connect("localhost","mysql_user","mysql_pwd");if (!$con) { die('Could not connect: ' . mysql_error()); } $rs= mysql_...

mysql数据库面试题(学生表_课程表_成绩表_教师表)
1、插入数据 2、删除课程表所有数据 3、将学生表中的姓名 张三修改为张大山 或者 4、查询姓’李’的老师的个数:5、查询所有课程成绩小于60的同学的学号、姓名:6、查询没有学全所有课的同学的学号、姓名 7、查询平均成绩大于60分的同学的学号和平均成绩 8、查询学过“100”并且也学过编号“101”...

高分求教,mysql数据库 怎么修改字段内容?
进入mysql,提示符下输入:use 你数据存放的数据库名字,回车 update 你输错日期的那个表的名字 set 输错日期的那个字段=‘你期望的日期’where 输错日期的那个字段 ='你输错的那个日期' ;回车 比如说:你输错日期的那个字段名是borndate,你的表名字是user,你输错的日期是1986-06-04那命令就是...

高分求个mysql数据库建建库建表
--创建数据库 CREATE DATABASE `test`CHARACTER SET 'gb2312'COLLATE 'gb2312_chinese_ci';--创建表 CREATE TABLE `user` (`te` INTEGER(11) DEFAULT NULL ) ENGINE=InnoDB CHARACTER SET 'gb2312' COLLATE 'gb2312_chinese_ci';

高分求解,为什么拼接的SQL语句比参数化的查询快
据库是SQL2000,记录行数700万行左右。mssql驱动包:sqljdbc4.jar 用拼接的SQL语句:SELECT * FROM UserInfo WHERE userID = 'aaa' AND DATEDIFF(DAY, deadline, GETDATE()) <= 0;比参数化的语句:SELECT * FROM UserInfo WHERE userID = ? AND DATEDIFF(DAY, deadline, GETDATE()) <= ...

mysql一段存储过程代码,一直提示有语法错误,高分请教,可以追加分数
CREATE PROCEDURE test_delete(IN i_id INT,OUT o_ret INT)BEGINDECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_ret=0;--后面都没有异常判断语句,这句话在存储中没有用到delete from member where member_id = i_id;set o_ret = 1;END;...

40位数据库MD5码破解,有例子,成功高分。
不可能的 MD5,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2、MD3、MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著名的公钥加密算法标准RSA的第一设计者R.Rivest于上个世纪90年代初开发出来的。MD5的最大作用在于,将不同格式的大容量文件信息在用数字签名软件来签署私人...

高分求解此函数问题的第二问,步骤要详细,分数可追加
高分求解此函数问题的第二问,步骤要详细,分数可追加  我来答 1个回答 #热议# 为什么现在情景喜剧越来越少了?mike 2015-07-10 · 知道合伙人教育行家 mike 知道合伙人教育行家 采纳数:14972 获赞数:41525 担任多年高三教学工作。 向TA提问 私信TA 关注 ...

怎么在源码里面找到连接数据的账号密码高分赏赐急
你在所有的源代码里面搜索mysql_connect语句,找到后看参数,如果这个参数是变量,那么就搜索所有的这个变量的语句,看赋值多少就知道了。如果mysql_connect函数没有参数,那么连接数据库的用户名和密码是在PHP.INI中的。

相似回答