Search code examples
oracle-databaseplsqloracle-sqldeveloperplsqldevelopermod-plsql

oracle sql statement to get counts with pivot, group by or windowing? oracle 11g


Is it possible to and can someone please give me a good example of selecting in one query a result set that returns counts for demographics or other things group by a certain grouping? That really sound cryptic so I am going to add an example output of what I am trying to communicate. I want a result set like:

enter image description here

So for each class a count of fields that are populated for Gender, a count of Male, a count of Female, a count of how many of race that are populated and so forth.

So something like Select curricul.class,count(stu.gender),count(stu.race),count(stu.eth) from curricul,stu group by class pivot( count(gender) for gender in (male, female)


Solution

  • You could simply use:

    with curricul as
    (select 1 classid, 'Math' class from dual union all
     select 2, 'Literature' from dual
    )
    ,
     student as
    ( select 1 id, 1 classid, 'male' gender, 1 race, 1 eth from dual union all
        select 2, 1, 'female', 1, 2 from dual union all
        select 3, 1, 'male'  , 3, 1 from dual union all
        select 4, 1, 'male'  , 5, 7 from dual union all
        select 5, 1, 'female', 4, 8 from dual union all
        select 6, 1, 'male'  , 1, 6 from dual union all
        select 7, 2, 'female', 3, 4 from dual union all
        select 8, 2, 'female', 1, 1 from dual union all
        select 9, 2, 'female', 7, 9 from dual union all
        select 10, 2, 'male' , 9, 1 from dual union all
        select 11, 2, 'female', 8, 1 from dual
    )
    select s.classid, curricul.class  
        ,count(s.gender)  as count_gender
        ,sum(case when gender = 'male' then 1 else 0 end) as count_male
        ,sum(case when gender = 'female' then 1 else 0 end) as count_female
        ,count(s.race)  as count_race
        ,count(s.eth) as count_ethnicity 
    from student s
    inner join curricul 
        on s.classid = curricul.classid
    group by s.classid, curricul.class ;