Mysql 使用同一表上的左联接的成员资格续订报告
我有两张桌子:Mysql 使用同一表上的左联接的成员资格续订报告,mysql,sql,left-join,inner-join,Mysql,Sql,Left Join,Inner Join,我有两张桌子: Member 'id' 'name' Membership 'id' 'site_id' 'member_id' 'year' 我想建立一个报告,以便在这样的年份跟踪订阅情况: 站点id 2019年认购总额 2018年认购总额 新建(首次订阅该网站) 续约(2019年和2018年在同一地点续约) 丢失(2018年完成但未在2019年完成该现场的潜水艇) 我在同一张会员资格表中的两个左连接上苦苦挣扎,如下所示: SELECT m.site_id, count(m2019.id
Member
'id'
'name'
Membership
'id'
'site_id'
'member_id'
'year'
我想建立一个报告,以便在这样的年份跟踪订阅情况:
会员资格
表中的两个左连接上苦苦挣扎,如下所示:
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;
计数是正确的,但条件是不正确的,所以我很确定我的查询是不正确的。
我在上面已经很久了,我开始觉得有点失落
谁能帮我找出哪里做错了?
谢谢我认为您可以通过两个级别的聚合来做您想做的事情:
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;
我认为通过两个级别的聚合,您可以做您想做的事情:
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;
样本数据和期望的结果会有帮助。样本数据和期望的结果会有帮助。这就是我需要的。谢谢你这正是我需要的。非常感谢。