如果某人的至少一门课程在Oracle中返回特定值,则对他进行分类

时间:2018-07-18 16:35:47

标签: sql oracle merge

上下文:此人上了几门课,他的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函数,但是无法合并两行。看起来很简单,但却无法解决。 :(

2 个答案:

答案 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

这是指“是”将排在“否”之后。

SQLFiddle here

好运。