2017-04-05 70 views
0

enter image description here这是当前结果SQL集团通过不返回准确的答案

select cat.sms_schoolcategoryid as categoryId, 
      cat.sms_name as category , 
      count(sch.sms_name) as schoolname, 
      count(stu.accountnumber)NoofStudent 
     from Filteredsms_schoolcategory cat 
inner join Filteredsms_school sch 
     on cat.sms_schoolcategoryid=sch.sms_schoolcategoryid 
inner join FilteredAccount stu 
     on sch.sms_schoolid=stu.sms_schoolid 
    group by cat.sms_schoolcategoryid, 
      cat.sms_name 
     ; 

我有三个表一个是分类和2是学校,三是学生。当我加入表格类别和学校时,我只想代表类别统计学校,这会返回准确的结果,当我将学生表格与学校表格结合起来时,会返回错误结果。请指导我如何可能。

+0

请创建一个小例子,包括输入,所需输出和实际输出。 –

+1

你能告诉我们原始数据和你从查询中返回的结果吗? –

+2

添加一些示例表格数据以及当前结果和预期结果 - 所有样式以及格式化文本。 – jarlh

回答

0

除非您提供有关您的数据模型的更多信息,否则有猜测。但是,您的问题似乎源于以下内容:

当您加入学生表时,对于学校类别和学校(*)的每种组合,都会生成其他记录。也就是说,你的sql不再按学校类别计算学校数,而是按学生计算。

对于一个具体的解决方案和一个很好的建议请参阅@ Nick.McDermaid的评论。

0

尝试这一个

select count(stu.accountnumber) as NoofStudent 
     , catsch.categoryId 
     , catsch.category 
     , catsch.schoolname 
from FilteredAccount stu 
inner join (
    select cat.sms_schoolcategoryid as categoryId 
     , cat.sms_name as category 
     , count(sch.sms_name) as schoolname 
     , sch.sms_schoolid 
    from Filteredsms_schoolcategory cat 
     inner join Filteredsms_school sch 
     on cat.sms_schoolcategoryid = sch.sms_schoolcategoryid 
    group by cat.sms_schoolcategoryid, cat.sms_name, sch.sms_schoolid) catsch 

    on catsch.sms_schoolid = stu.sms_schoolid 

group catsch.categoryId 
     , catsch.category 
     , catsch.schoolname 
0

count()返回非NULL值的数量。所以,你的两个count()将返回相同的值。您可以快速修复使用count(distinct)查询:

select cat.sms_schoolcategoryid as categoryId, 
     cat.sms_name as category , 
     count(distinct sch.sms_name) as schoolname, 
     count(distinct stu.accountnumber) as NoofStudent 
from Filteredsms_schoolcategory cat inner join 
    Filteredsms_school sch 
    on cat.sms_schoolcategoryid = sch.sms_schoolcategoryid inner join 
    FilteredAccount stu 
    on sch.sms_schoolid = stu.sms_schoolid 
group by cat.sms_schoolcategoryid, cat.sms_name ; 

其实,你可能不需要第二计数不同。只要count(stu.accountnumber)应该算在学生。