【问题标题】:Categorizing a person if at least one of his courses return a specific value in Oracle如果他的至少一门课程在 Oracle 中返回特定值,则对他进行分类
【发布时间】:2018-07-18 16:35:47
【问题描述】:

上下文:这个人参加了几门课,他的 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 行。这似乎很简单,但无法绕过它。 :(

【问题讨论】:

  • 如果一个人先拿 D 和 A 怎么办?我们还需要显示这个人吗?
  • 是的。在这种情况下,顺序无关紧要。因此,在您的情况下,该人仍然会有一行 Mark column= 'Yes'

标签: sql oracle merge


【解决方案1】:

你可以使用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 提供数据集)

【讨论】:

  • 如果你使用 MAX 那么你需要 distinct 吗?
  • 感谢它的工作。我使用了 MAX 函数,但在 GROUP BY 子句中也有类。把它拿出来很管用。
  • 第二个查询将返回预期的输出?
  • 我还假设它应该是 >=1 THEN 'YES' 而不是 >1 THEN 'YES'
  • @Gaj :感谢您的注意,我从问题中复制粘贴了它。
【解决方案2】:

你快到了。您可以使用以下内容:

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

祝你好运。

【讨论】:

  • 我们需要内联视图吗?请不要使查询复杂
猜你喜欢
  • 1970-01-01
  • 2020-05-28
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2019-02-15
相关资源
最近更新 更多