繁体   English   中英

SQL 一张表多列查询得到期望值

[英]SQL Query from one table and multiple columns to get the expected value

我有一个表 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

在此表中,仅当 Learning Item Type = 'Offering' 时才会填充 Offering_course 和 Activity_Name。 当学习项目类型=“课程”时,仅会填充学习项目名称列,并且提供课程和活动名称将为 null。

现在预期的 output 来自查询是 -

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 的学习项目名称 = '课程',并将活动名称显示为 null 和学习项目名称 = 'Offering' 课程名称列中应显示相应的活动名称。

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

这里不需要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

DB Fiddle 上的演示

NAME | ACTIVITY_NAME | COURSE_NAME | LEARNING_ITEM_TYPE
:--- | :------------ | :---------- | :-----------------
XYZ  | null          | COMPUTERS   | Course            
XYZ  | BIOTECH-1     | BIOTECH     | Offering          
DEF  | MATHS-1       | MATHS       | Offering          
DEF  | null          | Science     | Course            

您可以使用WINDOWS function 和简单的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM