```WITH t AS (
SELECT
b.*,
a.result,
a.date,
CASE
WHEN result = "right" THEN
1 ELSE 0
END flag
FROM
user_profile b
LEFT JOIN question_practice_detail a ON b.device_id = a.device_id
WHERE
university = "复旦大学"
) SELECT
device_id,
university,
count( result ) question_cnt,
sum( flag ) right_question_cnt
FROM
t
WHERE
date IS NULL
OR DATE_FORMAT( date, "%Y-%m" ) = "2021-08"
GROUP BY
device_id,
university
解题思路:
左连接2表保留用户完整信息,增加一列用0、1标记用户答题正确或者错误,然后对连表用条件复旦大学过滤形成一张仅含有复旦大学答题的临时表。 从临时表中以用户设备device_id和大学分组统计以条件为8月或者8月没答题的用户;查询的结果用sum(flag)、count(result)即为用户答题正确数和总共答题数。