首页 > 解决方案 > 在学生表中查找缺失值

问题描述

学生表包含已支付费用的年份和未支付费用期间的数据。如何找到丢失的年份。年份是2018 2019 2020 2021。现在要提到未支付费用的年份。

学生卡 缴费年份
101 2018
101 2019
101 2021
102 2018
102 2021

现在为 2018、2019、2021 年支付 101 费用,但 2020 年不支付 102 费用,2019 年和 2020 年也未支付 102 费用。所以输出应该是

学生卡 Year_of_Default
101 2020
102 2019,2020

标签: sqloraclejoin

解决方案


创建一个返回您搜索的年份的 CTE 和另一个返回不同学生 ID 的 CTE。
交叉加入它们并左加入您的表,然后过滤掉所有匹配的行。
其余行包含每个学生未支付的所有年份。
然后聚合并用于LISTAGG()收集每个学生的所有年份:

WITH 
  years(year) AS (
    SELECT 2018 FROM dual UNION ALL
    SELECT 2019 FROM dual UNION ALL
    SELECT 2020 FROM dual UNION ALL
    SELECT 2021 FROM dual
  ),
  students(Student_ID) AS (SELECT DISTINCT Student_ID FROM tablename)
SELECT s.Student_ID,
       LISTAGG(y.year, ',') WITHIN GROUP (ORDER BY y.year) Year_of_Default
FROM years y CROSS JOIN students s
LEFT JOIN tablename t
ON t.Year_of_paid_fee = y.year AND t.Student_ID = s.Student_ID
WHERE t.Student_ID IS NULL
GROUP BY s.Student_ID

请参阅演示


推荐阅读