基本计数查询

时间:2015-04-23 07:35:55

标签: sql oracle join count group-by

我有2个表return Author::with(['books' => function($query) { $query->scope(); } class

这是grade表中的示例行:

class

这是C_NAME....C_TIME...F_NAME..C_ROOM...SEMESTER INSS300...M5:30....DWIGHT..219BC....FALL11 INSS300...T5:30....KEEN....216BC....FALL11 MKT300....M5:30....Lee.....112BC....SP11 MKT300....W5:30....Lee.....112BC....SP11 INSS421...T5:30....CORY....212BC....FALL11 FIN300....TH5:30...KEEN....219BC....FALL11 INSS300...W5:30....CORY....219BC....FALL11 INSS300...F5:30....CORY....216BC....FALL11 INSS422...F5:30....KEEN....219BC....FALL11

中的示例数据
grade

我必须回答的问题是:

  

假设这些表位于您的帐户Ordb002中。你需要阅读   只允许所有三张桌子给你的小组成员Sally   帐户是Ordb009。假设您已获得Sally的读取权限   所有表格。莎莉想要得分(即A,B,C等)。   由教师和课程。为SALLY写一个查询来计算。

我提出了这个问题

S_NAME   C_NAME     G
LARRY....INSS300....B
LARRY....FIN300.....A
SONY.....INSS300....C
SONY.....INSS421....C
GRAY.....INSS300....C
GRAY.....INSS421....D
TRUDY....INSS300....B
DRUM.....INSS421....A
DRUM.....FIN300.....B
PURI.....INSS422....C
APPLE....INSS422....C
LARRY....INSS422....C
LARRY....INSS300....B
SONY.....INSS300....C
GRAY.....INSS300....C
TRUDY....INSS300....B

这给了我以下输出:

select cla.f_name
     , gra.c_name
     , count(grade)
     , grade
from class1 cla 
   , grade1 gra
where cla.c_name=gra.c_name
group by cla.f_name
       , gra.c_name
       , grade
order by cla.f_name
       , gra.c_name;

我不知道为什么4b和4 c出现在输出的顶部,当可能性只有2b和2 c时。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这是因为在你的类表中你有c_name和f_name的“重复”行,例如:

C_NAME    C_TIME   F_NAME  C_ROOM  SEMESTER
--------- -------- ------- ------- --------  
INSS300   W5:30    CORY    219BC   FALL11
INSS300   F5:30    CORY    216BC   FALL11

INSS300成绩表中的每一行都将与这些行匹配,从而导致计数翻倍。

因此,如果您的成绩表还没有记录该课程的时间,那么您将必须过滤您的班级表,以便每个c_name和f_name只显示一行。

或者,您可以先在成绩表中对行进行分组,然后将它们连接回类表,如果您仍然需要显示两行(尽管我认为这不是解决问题的正确方法)你正试图解决。)