透视计数查询

时间:2018-02-06 19:06:52

标签: oracle-sqldeveloper

您好我正在尝试创建一个查询,显示老年人公民考试的结果。我无法将结果显示为我想要的结果。

这是我的问题:

       select sch.name,
       u.SCS_GI_CIVICS_TEST

      from students s
      left join u_students u
      on s.dcid = u.studentsdcid
      left join schools sch
      on s.schoolid = sch.school_number

     WHERE s.enroll_status = '0 '
     and s.grade_level ='12' 
     and sch.ADDRESS is not null
     and (u.scs_gi_civics_test like '%SpEd-Exempted%'
     or u.scs_gi_civics_test IS NULL
     or u.scs_gi_civics_test like '%Passed%'
     or u.scs_gi_civics_test like '%Failed%'
     or u.scs_gi_civics_test like '%Has Not Taken%');

学校专栏很好。在我的公民测试结果中,有NULL,与未拍摄相同。我想合并它们并计算它们。我需要一个计数和百分比为NULL + HAS NOT Taken,Passed,Failed和Sped-Exempted。我知道我需要做一个支点或一个案例来完成这个,但是,我很遗憾如何使用所涉及的空值。 我需要以下列: 学校,SpEd豁免计数,SpEd豁免百分比,通过计数,通过百分比,失败计数和失败百分比,并且没有采取计数并且没有采取百分比(这包括未采取+空值) ***每个的百分比将来自所有这些值的总和。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我希望下面会给你答案。在下面的查询中,带有case语句的第一个选择将为所有通过/失败/未被采用/ SpEd-Exempted的学校的学生提供。 上部选择将计算所有学生(tot_students),并计算通过/失败的人并给出结果。

计数(通过)* 100 /计数(dcid)将给出从学校通过的人数百分比。

此查询按学校分组。

SELECT   sch.name,
    COUNT(sped),
    (COUNT(sped)*100/COUNT(dcid)) perc_sped,
    COUNT(pass),
    (COUNT(pass)*100/COUNT(dcid)) perc_pass,
    COUNT(fail),
    COUNT(fail)*100/COUNT(dcid) perc_fail,
    COUNT(not_taken) not_taken,
    COUNT(not_taken)*100/COUNT(dcid) perc_not_taken,
    COUNT(dcid) tot_students
  FROM
    (SELECT   s.dcid,
        sch.name,
        CASE
          WHEN u.scs_gi_civics_test LIKE '%SpEd-Exempted%'
          THEN 1
          ELSE NULL
        END sped ,
        CASE
          WHEN u.scs_gi_civics_test LIKE '%Passed%'
          THEN 1
          ELSE NULL
        END pass ,
        CASE
          WHEN u.scs_gi_civics_test LIKE '%Failed%'
          THEN 1
          ELSE NULL
        END fail ,
        CASE
          WHEN u.scs_gi_civics_test LIKE '%Has Not Taken%'
          THEN 1
          ELSE NULL
        END not_taken
      FROM
      FROM students s
      LEFT JOIN u_students u
      ON s.dcid = u.studentsdcid
      LEFT JOIN schools sch
      ON s.schoolid         = sch.school_number
      WHERE s.enroll_status = '0 '
        AND s.grade_level   ='12'
        AND sch.ADDRESS    IS NOT NULL
    )
  GROUP BY sch.name