SQL计数命令

SQL计数命令,sql,ms-access,count,if-statement,Sql,Ms Access,Count,If Statement,我怎样才能纠正这个问题 CREATE TABLE Student_Exam( Exam_ID INTEGER, S_ID INTEGER, Primary Key (Exam_ID, S_ID), Foreign Key (Exam_ID) References Exams(Exam_ID), Foreign Key (S_ID) References Students(S_ID), Pass TEXT ); CREATE TABLE Students( S_ID

我怎样才能纠正这个问题

CREATE TABLE Student_Exam(
  Exam_ID INTEGER,
  S_ID INTEGER,
  Primary Key (Exam_ID, S_ID),
  Foreign Key (Exam_ID) References Exams(Exam_ID),
  Foreign Key (S_ID) References Students(S_ID),
  Pass TEXT
);

CREATE TABLE Students(
  S_ID INTEGER PRIMARY KEY,
  First_Name TEXT,
  Surname TEXT
);

CREATE TABLE Exams(
  Exam_ID INTEGER PRIMARY KEY,
  Date_Taken DATE
);
我想数一数每个学生通过了多少次考试?SELECT命令中的计数应该是多少

选择Student.S\u ID,将*计算为期末考试级别 来自学生、考试、学生考试 其中Student.S\u ID=Student\u Exam.S\u ID 和考试。考试ID=学生考试。考试ID 还有考试。参加的日期 我建议您将pass更改为非文本字段。如果它只有yes和no,那么它应该是布尔值


我建议您将pass更改为非文本字段。如果只是有是和否,那么它应该是布尔值。

这个版本回答了如何基于条件计数的特定问题。作为奖励,它还将提供参加考试的次数

select s.s_id as student_id, count(*)
FROM students s
left join student_exam se on s.s_id = se.s_id and se.pass='yes'
left join exam e on se.exam_id = e.exam_id
group by s.s_id
根据您的其他评论,避免加入的版本为:

select
   s.s_id as student_id
  ,count(case when se.pass='Yes' then 1 end) as exams_passed
  ,count(*) as exams_taken
from
   Students s
   join Student_Exam se on s.s_id = se.s_id
   join Exam e on se.exam_id = e.exam_id
where
   e.date_taken between #1/1/2010# and #12/31/2010#
group by
   s.s_id
或者,这里有一个更简单的版本,不太喜欢case:


此版本回答了如何基于条件计数的特定问题。作为奖励,它还将提供参加考试的次数

select s.s_id as student_id, count(*)
FROM students s
left join student_exam se on s.s_id = se.s_id and se.pass='yes'
left join exam e on se.exam_id = e.exam_id
group by s.s_id
根据您的其他评论,避免加入的版本为:

select
   s.s_id as student_id
  ,count(case when se.pass='Yes' then 1 end) as exams_passed
  ,count(*) as exams_taken
from
   Students s
   join Student_Exam se on s.s_id = se.s_id
   join Exam e on se.exam_id = e.exam_id
where
   e.date_taken between #1/1/2010# and #12/31/2010#
group by
   s.s_id
或者,这里有一个更简单的版本,不太喜欢case:



分组和总结是报告中做得很好的事情,所以你不应该在报告中做得很好,你可能需要这样做,但可能不会。停止构建报表,而是构建一个SQL SELECT来返回正在汇总的数据,然后尝试将其用作报表的记录源。分组和汇总是报表非常好的功能,因此您不应该在报表中很好地执行此操作,您可能需要这样做,但可能不需要。停止生成报表,而是生成一个SQL SELECT,返回正在汇总的数据,然后尝试将其用作报表的记录源。我无法使用左联接、右联接或任何联接,我希望将其合并到另一个查询中。我不允许使用布尔值,我不是计算机专业的学生,我只允许使用文本、数字、整数、日期和时间,然后尝试在该字段中使用值为0或1的整数。因为我是商科学生,我们不允许作为旁白,您正在使用不使用join语句的语法进行连接-它仅限于所谓的内部连接。也就是说,使用WHERE子句实现的隐式连接与使用JOIN一词的显式连接一样。除非本课程旨在教您隐式联接的功能和限制,否则禁止使用联接的限制是毫无意义的。我不能使用左联接、右联接或任何联接,然后我想将其合并到另一个查询中。我不允许使用布尔值,我不是计算机专业的学生,我只允许使用文本、数字、整数、日期和时间,然后尝试在该字段中使用值为0或1的整数。因为我是商科学生,我们不允许作为旁白,您正在使用不使用join语句的语法进行连接-它仅限于所谓的内部连接。也就是说,使用WHERE子句实现的隐式连接与使用JOIN一词的显式连接一样。除非本课程旨在教您隐式联接的功能和限制,否则对使用联接的限制是毫无意义的。countcase当学生考试时。pass='Yes'则1结束为考试通过。请注意,传递在联接表中。我不明白学生考试“是”然后我就结束的情况。但不管怎样,我试过了,但没用。你认为你能进一步帮助我吗?哎呀。谢谢你的更正。当se.pass='Yes'条件为True时,case表达式将生成1,否则将生成NULL。Count将只计算非空行,为您提供通过考试的计数。没有空行。它是Yes或No。尽管可能是True,但如果不满足任何条件,case表达式将为NULL。当se.pass='Yes'然后1或0结束为考试通过时,替换用例将是sumcase,这几乎是相同的事情。啊。显然,Access不支持该案例。尝试一些类似sumiifStudent_考试的方法。通过class='Yes',1,0.countcase当学生考试时。通过class='Yes',然后1作为考试通过结束。请注意,传递在联接表中。我不明白学生考试“是”然后我就结束的情况。但不管怎样,我试过了,但没用。你认为你能进一步帮助我吗?哎呀。谢谢你的更正。当se.pass='Yes'条件为True时,case表达式将生成1,否则将生成NULL。Count将只计算非空行,为您提供通过考试的计数。没有空行。它是Yes或No。尽管可能是True,但如果不满足任何条件,case表达式将为NULL。当se.pass='Yes'然后1或0结束为考试通过时,替换用例将是sumcase,这几乎是相同的事情。啊。显然,访问不支持 rt案例。尝试一些类似sumiifStudent_考试的方法。通过class='Yes',1,0。
select
   s.s_id as student_id
  ,count(*) as exams_passed
from
   Students s
  ,Student_Exam se
  ,Exam e
where
   s.s_id = se.s_id
   and se.exam_id = e.exam_id
   and e.date_taken between #1/1/2010# and #12/31/2010#
   and se.pass = 'Yes'
group by
   s.s_id