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;