上下文:此人上了几门课,他的ID和所学的课程存储在Oracle数据库的不同行中。
主要目标:我想查看一个人是否参加了至少几个课程,然后将他标记为“是”,如果不是,则标记为“否”。
我的简化代码:
SELECT DISTINCT
ID AS Person_ID,
(CASE WHEN CLASS_TAKEN IN ('A','B','C')
THEN 'Yes'
ELSE 'No'
END) AS Mark
FROM classes_taken_table
Group By
ID,
CLASS_TAKEN
ORDER BY ID ASC
问题:该代码在大多数情况下都可以工作,除非人员同时获得A类和D类。现在在输出中为同一个人生成了两行,在“标记”列中一行为“是”,另一行为“否”。 。
如果该人已经有“是”行,我想删除该人的“否”行。
我尝试了Max函数,但是无法合并两行。看起来很简单,但却无法解决。 :(
答案 0 :(得分:0)
您可以使用MAX
函数
SELECT
id AS person_id,
MAX(
CASE
WHEN class_taken IN(
'A','B','C'
) THEN 'Yes'
ELSE 'No'
END
) AS mark
FROM classes_taken_table
GROUP BY id
ORDER BY id ASC
但是,这利用了字符串“是”比“否”更大的事实。
您可以使用COUNT
SELECT
id AS person_id,
CASE
WHEN COUNT(
CASE
WHEN class_taken IN(
'A','B','C'
) THEN 1
END
) >= 1 THEN 'Yes'
ELSE 'No'
END
AS mark
FROM classes_taken_table
GROUP BY id
ORDER BY id ASC
Demo(感谢@Bob Jarvis的数据集)
答案 1 :(得分:0)
您快到了。您可以使用以下内容:
SELECT PERSON_ID, MAX(MARK)
FROM (SELECT ID AS PERSON_ID,
CASE WHEN CLASS_TAKEN IN ('A','B','C')
THEN 'Yes'
ELSE 'No'
END AS Mark
FROM CLASSES_TAKEN_TABLE)
GROUP BY PERSON_ID
ORDER BY PERSON_ID
这是指“是”将排在“否”之后。
好运。