sql - 根据条件消除 SQL 行
问题描述
SELECT g.new_attempt, c.fullname, c.new_intaketermidname
, g.new_module, c.new_programmeidname, g.statecodename
, cp.new_termidname, c.statuscodename, g.new_resultstatusname, g.statuscodename
FROM [NUP_MSCRM].[dbo].[FilteredNew_grade] g
join [NUP_MSCRM].[dbo].New_studentprogress sp on sp.New_studentprogressId = g.new_progressid
join [NUP_MSCRM].[dbo].FilteredContact c on c.contactid = sp.New_ContactId
join [NUP_MSCRM].[dbo].[FilteredNew_coursesofprogramme] cp on cp.new_coursesofprogrammeid = g.new_courseid
join [NUP_MSCRM].[dbo].FilteredNew_programme p on p.new_programmeid = c.new_programmeid
where c.statecodename = 'Active'
and c.statuscodename not in ('Alumni (active)')
and c.fullname = 'Stefanos Chalvatzis'
这会带来该特定学生的所有成绩(失败,通过),我想做的只是获得该学生的重考,但如果该学生在学期期间的任何时间通过了该课程,则省略重考行和通过的行,有没有办法做到这一点?
例如:
new_attempt fullname new_intaketermidname new_module new_programmeidname statecodename new_termidname statuscodename new_resultstatusname statuscodename
1 Stefanos Chalvatzis 2017-18 / Fall ΝΟΜ229-GR LLB Law - Greek Law Inactive 2018-19 / Spring Registered Fail Resit coursework & exam
2 Stefanos Chalvatzis 2017-18 / Fall ΝΟΜ229-GR LLB Law - Greek Law Inactive 2018-19 / Spring Registered Pass Completed
正如您在此处看到的,该学生在 NOM229 中进行了重考,但在第二次尝试中通过了该课程 - 如果上述情况属于这种情况,我希望我的查询省略这两行,否则仅显示重考(如果找不到该课程为后来通过)。
解决方案
以下适用于您提供的示例,使用 CTE 您可以检查pass
结果是否存在,如果存在,则不返回该学生的结果。
WITH cte AS (
SELECT g.new_attempt, c.fullname, c.new_intaketermidname
, g.new_module, c.new_programmeidname, g.statecodename
, cp.new_termidname, c.statuscodename, g.new_resultstatusname, g.statuscodename, c.new_studentid
FROM [NUP_MSCRM].[dbo].[FilteredNew_grade] g
join [NUP_MSCRM].[dbo].New_studentprogress sp on sp.New_studentprogressId = g.new_progressid
join [NUP_MSCRM].[dbo].FilteredContact c on c.contactid = sp.New_ContactId
join [NUP_MSCRM].[dbo].[FilteredNew_coursesofprogramme] cp on cp.new_coursesofprogrammeid = g.new_courseid
join [NUP_MSCRM].[dbo].FilteredNew_programme p on p.new_programmeid = c.new_programmeid
where c.statecodename = 'Active'
and c.statuscodename not in ('Alumni (active)')
--and c.fullname = 'Stefanos Chalvatzis'
)
SELECT *
FROM cte C1
WHERE NOT EXISTS (
SELECT 1
FROM cte C2
WHERE C2.statuscodename = 'Pass'
AND C2.new_studentid = C1.new_studentid
);
推荐阅读
- vba - 比较两个工作簿并删除匹配的行
- python - 是否有任何带有 key 参数的 set() Python 实现?
- azure-data-lake - uSQL 超出最大请求长度
- ios - 在 Xcode 10 中测量 UI 元素之间的距离
- python - 具有单引号和双引号以及缩写的 Python 解析文件
- asp.net - FindControl 在 MasterPage 中返回 null
- java - 将python中的keras转换为java
- c# - polly 在给定时间段内重试策略
- php - Laravel artisan 命令忽略 Memcached 的 php.ini 设置
- r - 更改 r 图中的颜色