Отчет о продлении членства с использованием левого соединения за одним столом - PullRequest
1 голос
/ 28 октября 2019

У меня есть две таблицы:

Member
'id'
'name'

Membership
'id'
'site_id'
'member_id'
'year'

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

  1. Идентификатор сайта
  2. всего подписка на 2019 год
  3. всего подписка на 2018 год
  4. NEW (первая подписка на этот сайт)
  5. Обновление (подписки в 2019 и 2018 годах на одном сайте)
  6. Потерян (подпрограммы, сделанные в 2018 году, но не в 2019 году для этого сайта)

Я борюсь за два левых соединения на одной и той же таблице Membership, например:

SELECT m.site_id, 
count(m2019.id) as total2019, 
count(m2018.id) as total2018, 
SUM(IF(m2019.member_id IS NOT NULL AND m2018.member_id IS NULL, 1, 0)) new, 
SUM(IF(m2019.member_id IS NOT NULL AND m2018.member_id IS NOT NULL AND m2018.site_id = m2019.site_id, 1, 0)) renewal, 
SUM(IF(m2018.member_id IS NOT NULL AND m2019.member_id IS NULL, 1, 0)) lost 
FROM membership m 
LEFT JOIN membership m2019 ON m.id = m2019.member_id AND m.year = '2019' AND m2019.year = '2019' AND m.site_id = m2019.site_id 
LEFT JOIN membership m2018 ON m.id= m2018.member_id AND m.year = '2018' AND m2018.year = '2018' AND m.site_id = m2018.site_id 
GROUP BY m.site_id;

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

Может ли кто-нибудь помочь мне выяснить, где я делаю неправильно? Спасибо

1 Ответ

0 голосов
/ 28 октября 2019

Я думаю, что вы можете делать что хотите с двумя уровнями агрегации:

SELECT m.site_id, 
       SUM( m.max_year = 2019 ) as total2019, 
       SUM( m.min_year = 2018 ) as total2018,
       SUM( m.min_year = 2019 AND m.max_year = 2019 ) as new2019,
       SUM( m.min_year = 2018 and m.max_year = 2018 ) as renewals,
       SUM( m.max_year = 2018 ) as lost
FROM (SELECT m.id, m.site_id, MIN(year) as min_year, MAX(year) as max_year
      FROM membership m
      WHERE year in (2018, 2019)
      GROUP BY m.id, m.site_id
     ) mm
     ON mm.id = m.id
GROUP BY m.site_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...