sql - 在学生表中查找缺失值
问题描述
学生表包含已支付费用的年份和未支付费用期间的数据。如何找到丢失的年份。年份是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 |
解决方案
创建一个返回您搜索的年份的 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
请参阅演示。
推荐阅读
- reporting-services - SSRS 如何为图表元素生成随机颜色
- excel - 如果表格为空且不复制任何内容,如何制作循环?
- html - 如何在文本内使用带有链接的“断词:断词”?
- python - 如何在 django 中创建新的数据库连接
- r - R 没有显示所有观察结果
- python - 如何从 python 脚本中运行 groovy 脚本?
- java - 规则文件应该位于 Eclipse IDE 的 TokenRegex(StanfordCoreNLP) 中的什么位置?
- express - HTML 不通过 EJS 呈现
- java - 验证骰子的组合
- reactjs - React:如何在不删除所有其他道具的情况下更新数组中的项目?