题目主要信息:

  • 试卷的类别 tag 可能出现大小写混乱的情况,先筛选出试卷作答数小于3的类别tag,统计将其转换为大写后对应的原本试卷作答数。
  • 如果转换后 tag 并没有发生变化,不输出该条结果。

问题拆解:

  • 筛选出当前 tag 与转换为大写 tag 后不同的考试信息。按照 tag 聚合统计出现的次数。知识点:UPPER, GROUP BY, COUNT
    • tag != UPPER(tag)
    • 根据 tag 进行 GROUP BY 操作,通过 COUNT(1) 统计每个 tag 对应的作答数
  • 统计每个 tag 的作答数,将上述两表进行 INNER JOIN。JOIN 时需要判断 UPPER(origin.tag) = upper_table.tag
  • 在符合条件的记录中筛选出原始出现次数小于三次的 tag,输出结果。知识点:WHERE

代码:

SELECT
    origin.tag,
    upper_table.answer_cnt
FROM
(
    SELECT tag, COUNT(1) AS answer_cnt
    FROM exam_record LEFT JOIN examination_info
    ON exam_record.exam_id = examination_info.exam_id
    WHERE tag != UPPER(tag)
    GROUP BY tag
) AS origin
INNER JOIN
(
    SELECT tag, COUNT(1) AS answer_cnt
    FROM exam_record LEFT JOIN examination_info
    ON exam_record.exam_id = examination_info.exam_id
    GROUP BY tag
) AS upper_table
ON UPPER(origin.tag) = upper_table.tag
WHERE
    origin.answer_cnt < 3