Расчет процента по сравнению с подвыбором SQL - PullRequest
0 голосов
/ 08 ноября 2019

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

Сначала я рассчитал количество событий, происходящих в каждой кампании:

select count(*) as counter
               from campaigns_log
               where event IN ('send', 'open')
                 and campaign_id is not null
               group by campaign_id, email

Затем ясгруппировали кампании по условию, произошло ли более одного события:

select count(counter) as occurences, IF(counter > 1, 2, 1) as grouper
         from (select count(*) as counter
               from campaigns_log
               where event IN ('send', 'open')
                 and campaign_id is not null
               group by campaign_id, email) as counters_table
         group by grouper

Образец результата:

occurences ¦ grouper
132        ¦ 1
360        ¦ 2

Теперь я хочу рассчитать для каждой строки процент от общего числа вхождений. Итак, что-то вроде этого:

occurences ¦ grouper ¦ percentage
132        ¦ 1       ¦ 132/(132+360)
360        ¦ 2       ¦ 360/(132+360)

Я пробовал это, но это не работает, он не рассчитывает общую сумму:

select *, occurences/(select sum(occurences))
from (
         select count(counter) as occurences, IF(counter > 1, 2, 1) as grouper
         from (select count(*) as counter
               from campaigns_log
               where event IN ('send', 'open')
                 and campaign_id is not null
               group by campaign_id, email) as counters_table
         group by grouper
     ) as occurences_table group by occurences, grouper

Любая идея, где моя ошибка впоследний шаг?

1 Ответ

1 голос
/ 08 ноября 2019

используйте подзапрос для общего количества и деления

select a.occurences,a.grouper, (a.occurences/c.total) as percentage
from (select count(counter) as occurences, IF(counter > 1, 2, 1) as grouper
             from (select count(*) as counter
                   from campaigns_log
                   where event IN ('send', 'open')
                     and campaign_id is not null
                   group by campaign_id, email) as counters_table
             group by grouper
   ) a,
    (select sum(occurences) total from
    (select count(counter) as occurences, IF(counter > 1, 2, 1) as grouper
             from (select count(*) as counter
                   from campaigns_log
                   where event IN ('send', 'open')
                     and campaign_id is not null
                   group by campaign_id, email) as counters_table
             group by grouper
   ) b )c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...