SQL与计数

SQL与计数,sql,ms-access,aggregate-functions,Sql,Ms Access,Aggregate Functions,我有一张桌子,它由以下几部分组成 Student Name Grade Class -------------------------------------------------------- User 1 A English User 1 B Math User 2 B Math 我正在尝试创建一个查询,其中将列出所有学生、总

我有一张桌子,它由以下几部分组成

Student Name        Grade       Class
--------------------------------------------------------
User 1              A           English
User 1              B           Math
User 2              B           Math
我正在尝试创建一个查询,其中将列出所有学生、总及格分数(a、B和C级)、总a、总B、总C


有人能帮我创建查询,或者至少帮我找到正确的方向吗?

你应该使用
sum
而不是
count
,并在内部使用条件表达式,如下所示:

select
  sum(case when grade in ('A','B','C') then 1 else 0 end) as passing
, sum(case when grade = 'A' then 1 else 0 end) as NumA
, sum(case when grade = 'B' then 1 else 0 end) as NumB
, sum(case when grade = 'C' then 1 else 0 end) as NumC
from grades
此示例适用于SQL Server,但其他RDBMS也有类似的功能。

尝试一下:

select name,
    count(case when grade in ('A', 'B', 'C') then 1 end) totalPass,
    count(case when grade = 'A' then 1 end) totalA,
    count(case when grade = 'B' then 1 end) totalB,
    count(case when grade = 'C' then 1 end) totalC
from t
group by name
这是你的电话号码

或者,如果您使用的是MySQL,我们可以让它变得更简单:

select name,
    sum(grade in ('A', 'B', 'C')) totalPass,
    sum(grade = 'A') totalA,
    sum(grade = 'B') totalB,
    sum(grade = 'C') totalC
from t
group by name

下面是另一个可能的答案(很长,但不言自明):


下面是Access SQL中的一个解决方案,分为两个单独的查询:

每个学生的总及格分数:

SELECT grades.StudentName, Count(grades.Grade) AS NumberOfPassGrades
FROM grades
WHERE (((grades.Grade) In ('A','B','C')))
GROUP BY grades.StudentName
ORDER BY grades.StudentName;
总A、总B、总C数量:

SELECT grades.StudentName, grades.Grade, Count(grades.Grade) AS NumberOfGrades
FROM grades
GROUP BY grades.StudentName, grades.Grade
ORDER BY grades.StudentName, grades.Grade;

如果您确实只需要一个查询,最简单的方法是将两个查询保存为Access查询,并将它们连接到StudentName上。然而,当一个学生有多个不同的年级时,你会不止一次地获得passgrades的数量。

你是在寻找每个年级的总数吗?@ShaikhFarooque:是的,只是每个学生的passgrades和所有passgrades的实例总数。虽然这是我在寻找的,这在MS Access中不起作用(很抱歉,我应该在前面提到这一点),您是否有一个在MS Access中起作用的替代方案?案例陈述在实践中不起作用Access@Imran我使用linux,但没有访问权限。尝试将
sum
解决方案中的比较替换为。类似于:
iif(grade='A',1,0)
总及格分数查询起作用,这就是我想要的。然而,第二个查询显示每个分数,我试图实现的是在一列中显示每个用户和总分数。Mosty Mostacho说得对,但唯一的问题是我相信案例陈述在MS中不起作用Access@Imran:您是说您不希望第二次查询中的每个等级,而只希望所有等级的总和?这听起来就像是我的第一个问题……或者我不明白你想做什么。
SELECT grades.StudentName, grades.Grade, Count(grades.Grade) AS NumberOfGrades
FROM grades
GROUP BY grades.StudentName, grades.Grade
ORDER BY grades.StudentName, grades.Grade;