Как запросить данные, которые опущены в результатах - PullRequest
0 голосов
/ 21 сентября 2018

Итак, у меня есть следующая информация

Вывод

Diabetic    Schools   studentcount
false        9010         180
true         9010           3
false        9012         245
true         9012           4

Запрос

Select s.diabetic as diabetic, sch.buildingid as Schools, 
       count(distinct s.studentnmr) as Studentcount
from student s
inner join studentschool ss.studentid = s.studentid
inner join school sch.id = ss.schoolid
order by sch.id

Я хочу

Diabetic    addresse    studentcount    calculation
true           9010           3             1,64 %
true           9012           4             1,61 %

, где расчет равен

( sum(diabetic=true)/sum(total number of students of the school) )*100

Дополнительный совет: есть еще одно поле с именем

 diabeticdate 

, в котором указана дата, когда диабетическая истина.

Моя проблема

, когда я выбираю

select sum(Case when s.diabetic is null then 1 else 0 end) AS notD

Я не вижу ничего, кроме записи диабетической - Истинный статус

Как мне обойти это

примечание: если у вас есть лучший заголовок для вопроса, пожалуйста, предложите!

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вы можете использовать оконную функцию SUM OVER, чтобы получить общее количество студентов.Оконные функции работают с результатами, которые у вас уже есть, так сказать после агрегирования: -)

select
  s.diabetic as diabetic,
  sch.buildingid as Schools, 
  count(distinct s.studentnmr) as Studentcount,
  count(distinct s.studentnmr)::decimal / 
    sum(count(distinct s.studentnmr)) over (partition by sch.buildingid) * 100 as rate
from student s
inner join studentschool on ss.studentid = s.studentid
inner join school on sch.id = ss.schoolid
group by sch.buildingid, s.diabetic
order by sch.buildingid, s.diabetic;
0 голосов
/ 21 сентября 2018

Вы можете использовать условное агрегирование, чтобы показать по одной строке на школу с их показателями диабета:

select
  sch.buildingid as Schools, 
  count(distinct s.studentnmr) as Studentcount
  count(distinct case when s.diabetic then s.studentnmr end) as Diabeticcount,
  count(distinct case when s.diabetic then s.studentnmr end) /
    count(distinct s.studentnmr) * 100 as rate
from student s
inner join studentschool on ss.studentid = s.studentid
inner join school on sch.id = ss.schoolid
group by sch.buildingid
having count(distinct case when s.diabetic then s.studentnmr end) > 0
order by sch.buildingid;

Удалите предложение HAVING, если вы также хотите видеть школы без диабетиков.

0 голосов
/ 21 сентября 2018

Вы можете попробовать ниже, используя over ()

  with t1 as
    (
    Select s.diabetic as diabetic, sch.buildingid as Schools, 
           count(distinct s.studentnmr) as Studentcount
    from student s
    inner join studentschool ss.studentid = s.studentid
    inner join school sch.id = ss.schoolid
    order by sch.id

    ),
t2 as
(
select case when Diabetic='true' then Schools end as addresse,
case when when Diabetic='true' then studentcount end as studentcount,
((case when when Diabetic='true' then studentcount end)::decimal/(sum(studentcount) over())) *100 as calculation
) select * from t2
...