Подсчет на основе другого подсчета - MySQL - PullRequest
0 голосов
/ 12 мая 2018

У меня есть следующий Набор таблиц , и я хочу получить все услуги, возрастные диапазоны и полы, и рядом с каждым из них количество получателей, соответствующее им.Пока что я пришел с утверждением ниже, и оно работает.

select s.service_name,s.service_id,g.gender_id,ag.age_range_id,count(r.recipient_id) Temp
from tbl_services s inner join tbl_gender g
                    inner join tbl_age_range ag
                    left join tbl_recipient_services rs on rs.service_id=s.service_id
                    left join tbl_recipient r on r.gender_id=g.gender_id and rs.recipient_id=r.recipient_id 
                                              and (year(sysdate())-year(r.recipient_birth_date) >=  min_age and year(sysdate())-year(r.recipient_birth_date) <=  max_age)
group by s.service_id,g.gander_id,ag.age_range_id

Но мне нужно только подсчитать получателей, которые имеют 2 или более услуг в tbl_recipient_services, и я снова застрял.

У кого-нибудь есть идея, чтобы это исправить?

1 Ответ

0 голосов
/ 12 мая 2018

Во-первых, ваш запрос будет более понятным с помощью cross join s:

select s.service_name, s.service_id, g.gender_id, ag.age_range_id,
       count(r.recipient_id) as all_recipients
from tbl_services s cross join
     tbl_gender g cross join
     tbl_age_range ag left join
     tbl_recipient_services rs
     on rs.service_id = s.service_id left join
     tbl_recipient r
     on r.gender_id = g.gender_id and
        rs.recipient_id = r.recipient_id and
        year(sysdate()) - year(r.recipient_birth_date) >=  min_age and
        year(sysdate()) - year(r.recipient_birth_date) <=  max_age)
group by s.service_id, g.gender_id, ag.age_range_id;

Это возвращает все комбинации обслуживания / пола / возраста, даже если совпадений нет.

Давайте добавимдругой столбец.Для этого мы будем использовать подзапрос для подсчета количества услуг на получателя, а затем включим его в число:

select s.service_name, s.service_id, g.gender_id, ag.age_range_id,
       count(r.recipient_id) as num_recipients,
       sum(rs2.num_services >= 2) as num_recipients_2plus 
from tbl_services s cross join
     tbl_gender g cross join
     tbl_age_range ag left join
     tbl_recipient_services rs
     on rs.service_id = s.service_id left join
     tbl_recipient r
     on r.gender_id = g.gender_id and
        rs.recipient_id = r.recipient_id and
        year(sysdate()) - year(r.recipient_birth_date) >=  min_age and
        year(sysdate()) - year(r.recipient_birth_date) <=  max_age) left join
    (select rs2.recipient_id, count(*) as num_services
     from tbl_recipient_services rs2
     group by rs2.recipient_id
    ) rs2
    on rs2.recipient_id = r.recipient_id
group by s.service_id, g.gender_id, ag.age_range_id;

Если вам не нужен дополнительный столбец, вы можете изменить left join s к внутренним соединениям и удалите count(r.recipient_id).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...