2013-07-29 73 views
0

我在我的dbpre_exer5这些表内声明; // MySQL的wampserver2.2多选择存储过程的mysql

+-----------------------+ 
| Tables_in_dbpre_exer5 | 
+-----------------------+ 
| tblcourse    | 
| tblcutoff    | 
| tblgrades    | 
| tblstud    | 
| tblsub    | 
+-----------------------+ 

现在,我只想问我将如何能够得到这些输出考虑存储过程的使用。 输出为:

+---------+----------------+---------------+-------+ 
| Gender | With Failure | W/out Failure | Total | 
+---------+----------------+---------------+-------+ 
| Male |  1  |  1  | 2 | 
| Female |  2  |  1  | 3 | 
+---------+----------------+---------------+-------+ 

这里的方式是enter code here; **

mysql> select * from tblcourse; 
+-----------+------------------------+ 
| course_id | course_name   | 
+-----------+------------------------+ 
|   1 | Information Technology | 
|   2 | Computer Science  | 
+-----------+------------------------+ 
2 rows in set (0.00 sec) 

mysql> select * from tblgrades; 
+---------+--------+-------+ 
| stud_id | sub_id | grade | 
+---------+--------+-------+ 
|  1 |  1 | 80 | 
|  1 |  2 | 78 | 
|  2 |  2 | 75 | 
|  2 |  3 | 84 | 
|  3 |  1 | 81 | 
|  3 |  3 | 90 | 
|  4 |  1 | 74 | 
|  4 |  2 | 77 | 
|  5 |  2 | 76 | 
|  5 |  3 | 81 | 
+---------+--------+-------+ 
10 rows in set (0.00 sec) 

mysql> select * from tblcourse; 
+-----------+------------------------+ 
| course_id | course_name   | 
+-----------+------------------------+ 
|   1 | Information Technology | 
|   2 | Computer Science  | 
+-----------+------------------------+ 
2 rows in set (0.00 sec) 

mysql> select * from tblcutoff; 
+-----------+ 
| passgrade | 
+-----------+ 
|  78 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> select * from tblgrades; 
+---------+--------+-------+ 
| stud_id | sub_id | grade | 
+---------+--------+-------+ 
|  1 |  1 | 80 | 
|  1 |  2 | 78 | 
|  2 |  2 | 75 | 
|  2 |  3 | 84 | 
|  3 |  1 | 81 | 
|  3 |  3 | 90 | 
|  4 |  1 | 74 | 
|  4 |  2 | 77 | 
|  5 |  2 | 76 | 
|  5 |  3 | 81 | 
+---------+--------+-------+ 
10 rows in set (0.00 sec) 

mysql> select * from tblstud; 
+---------+-------------------+--------+-----------+ 
| stud_id | stud_name   | gender | course_id | 
+---------+-------------------+--------+-----------+ 
|  1 | Angelina Jolie | F  |   1 | 
|  2 | Jennifer Garner | F  |   1 | 
|  3 | Liam Neeson  | M  |   2 | 
|  4 | Paul Walker  | M  |   2 | 
|  5 | Jennifer Lawrence | F  |   2 | 
+---------+-------------------+--------+-----------+ 
5 rows in set (0.00 sec) 

mysql> select * from tblsub; 
+--------+------------+ 
| sub_id | sub_name | 
+--------+------------+ 
|  1 | Math 1  | 
|  2 | English 1 | 
|  3 | Filipino 1 | 
+--------+------------+ 
3 rows in set (0.00 sec) 

mysql> 

**

我的第一个问题是有结果 “男” 和 “女” 下的性别.. 任何帮助吗?非常感谢。

+0

@Luv我无法使存储过程..我只做到了通SELECT语句,但仍输出错误 – user2628953

+0

内部的功能有没有办法从中获取值3ormore表? – user2628953

+0

谢谢@Luv。 – user2628953

回答

0

修订

SELECT gender, 
     SUM(failure) `With failure`, 
     COUNT(*) - SUM(failure) `Without failure`, 
     COUNT(*) total 
    FROM 
(
    SELECT s.stud_id, 
     CASE WHEN s.gender = 'M' THEN 'Male' ELSE 'Female' END gender, 
     MAX(CASE WHEN g.grade < c.passgrade THEN 1 ELSE 0 END) failure 
    FROM tblgrades g JOIN tblstud s 
     ON g.stud_id = s.stud_id CROSS JOIN tblcutoff c 
    GROUP BY s.stud_id 
) q 
GROUP BY gender 

输出示例:

 
| GENDER | WITH FAILURE | WITHOUT FAILURE | TOTAL | 
--------------------------------------------------- 
| Female |   2 |    1 |  3 | 
| Male |   1 |    1 |  2 | 

这里是SQLFiddle演示

+0

是的,先生..但失败的计数应该是唯一的。 .student_id采取subj_id ..这意味着失败计数也必须与主题相结合..stud_id && subj_id – user2628953

+0

@ user2628953它已经“集成”在'tblgrades'表中的这种方式,不是吗?如果没有,请详细解释你的样本数据应该怎样,哪些不应该算作失败,我们可以修复查询。 – peterm

+0

说stud_id 4失败sub_id 1和2,查询应该只计数这个失败为1 ..计数是不依赖于有多少个主题stud_id失败,但如果stud_id失败,然后计数 – user2628953

0

您可以使用一个简单的case语句:

CASE WHEN 'F' THEN SELECT 'Female' ELSE SELECT 'Male' 

Further reading