SQL计数唯一行,其中列包含两个不同的值

时间:2013-05-16 15:46:15

标签: sql database count

我已经好好看了一下,但却找不到与我相符的任何问题。也许我在搜索时没有使用正确的语言或者其他什么,但是这里有。

我有一个名为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,因为只有埃德加同时学习数学和德语。

以下是我迄今为止尝试的一些查询无效: - (

这是在对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
);

这些都没有出现,任何帮助都会受到高度赞赏。

2 个答案:

答案 0 :(得分:5)

SELECT  COUNT(*) totalStudent
FROM
        (
            SELECT  student_name
            FROM    Classes
            WHERE   class IN ('Math','German')
            GROUP   BY student_name
            HAVING  COUNT(*) = 2
        ) subAlias

输出

╔══════════════╗
║ TOTALSTUDENT ║
╠══════════════╣
║            1 ║
╚══════════════╝

答案 1 :(得分:4)

还可以执行以下操作:

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;

这解决了表中包含重复行的问题(如评论者指出的另一个答案)