我仔细查看了一下,没有找到任何与我的问题相匹配的问题。也许我在搜索时没有使用正确的语言,但还是这样。
我有一个名为Classes的SQL表,它看起来像这个
Student_Name | Class
--------------------
Edgar | Chemistry
Allan | Chemistry
Burt | Chemistry
Edgar | Math
Sue | Math
Hamilton | Math
Edgar | English
Sue | English
Edgar | German
Ben | German
我想数一下有多少学生同时学习数学和德语。
在本例中假设如下:-学生姓名是唯一的-一个学生可以上很多课
从逻辑上讲,我会使用select语句来获得正在学习数学的学生的结果集。然后,我会浏览结果集中的每个Student_Name,并对照表格进行检查,看看有多少人在学习德语。
在这种情况下,我希望返回1,因为只有Edgar同时学习数学和德语。
以下是我迄今为止尝试过的一些查询,但没有成功:-(
这是在对DISTINCT做了一些研究之后:
SELECT COUNT(DISTINCT Student_Name) FROM Classes WHERE Class = 'Math' AND Class = 'German';
这是在了解了更多关于GROUP BY的信息之后:
SELECT COUNT(*) FROM (
SELECT DISTINCT Student_Name FROM Classes
WHERE Class IN ( 'Math', 'German' )
GROUP BY Student_Name
);
这两个结果都不太好,任何帮助都将不胜感激。
SELECT COUNT(*) totalStudent
FROM
(
SELECT student_name
FROM Classes
WHERE class IN ('Math','German')
GROUP BY student_name
HAVING COUNT(*) = 2
) subAlias
- SQLFiddle演示
输出
╔══════════════╗
║ TOTALSTUDENT ║
╠══════════════╣
║ 1 ║
╚══════════════╝
还可以执行以下操作:
select count(distinct a.Student_name)
from Classes a inner join Classes b on
a.Class = 'German' and
b.Class = 'Math' and
a.Student_Name = b.Student_name;
这解决了表中包含重复行的问题(正如另一个答案的注释所指出的(