【问题标题】:SQL Query from one table and multiple columns to get the expected valueSQL 查询一张表多列得到期望值
【发布时间】:2020-05-21 00:59:47
【问题描述】:

我有一个表 XX_LEARN 有以下详细信息

Name    Offering_course       Activity_Name      Learning Item Name         Learning Item Type
XYZ                                                    COMPUTERS              Course
XYZ      BIOTECH              BIOTECH-1                BIOTECH_OFFER          Offering
XYZ                                                    BIOTECH_OFFER          Course                                                               
DEF      MATHS                MATHS-1                  MATHS_OFFER            Offering
DEF                                                      Science                Course

在此表中,仅当学习项目类型 = 'Offering' 时才会填充 Offering_course 和 Activity_Name。当学习项目类型 = 'Course' 时,仅会填充学习项目名称列,并且这些项目的课程和活动名称将为空。

现在查询的预期输出是 -

Name           Activity_Name            Course Name        Learning Item Type
    XYZ                                  COMPUTERS              Course
    XYZ        BIOTECH-1                 BIOTECH                Offering                                                    
    DEF        MATHS-1                   MATHS                  Offering
    DEF                                  Science                Course

即课程名称列应包含来自 XX_Learn 的学习项目名称 = 'Course' 并将活动名称显示为空,对于这些和学习项目名称 = 'Offering' 提供的课程应显示在此课程名称列中,并带有相应的 Activity_Name。

这必须在单个查询中完成,因为我在 OTBI 分析中使用它。有什么方法可以使用 UNION 函数来实现吗?

【问题讨论】:

  • 这和OBIEE有什么关系?它不使用查询。它使用模型。

标签: sql oracle obiee


【解决方案1】:

这里不需要union。你可以只使用case 表达式:

select
    name,
    activity_name,
    case when learning_item_type = 'Course'
        then learning_item_name
        else offering_course
    end course_name,
    learning_item_type
from mytable

Demo on DB Fiddle

姓名 | ACTIVITY_NAME |课程名称 | LEARNING_ITEM_TYPE :--- | :------------ | :------------ | :----------------- XYZ | |电脑 |课程 XYZ |生物技术-1 |生物技术 |提供 防御工事 |数学-1 |数学 |提供 防御工事 | |科学 |课程

【讨论】:

  • @GMB- 我已经编辑了您对“插入”的查询,以显示我现在面临的确切问题。你能帮我删除重复的吗?
【解决方案2】:

你可以使用WINDOWS函数和简单的CASE..WHEN如下:

select * from
(select name, activity_name, case when learning_item_type = 'Course'
        then learning_item_name
        else offering_course
    end course_name,
    row_number() over (partition by learning_item_name order by learning_item_type desc) as rn
from your_table)
where rn = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 2021-10-20
    • 2017-02-03
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多