从一个表和多个列进行sql查询,以获取期望值

h43kikqp  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(342)

我有一张table,上面有以下细节

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'时,才会填充课程和活动名称。当learning item type='课程'时,仅填充列learning item name,并且这些列的课程和活动名称将为空。
现在,查询的预期输出是-

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

i、 e.课程名称列应包括学习项目名称='课程'来自xx\u learn,并将活动名称显示为空,对于学习项目名称='提供',提供的课程应与相应的活动名称一起显示在此课程名称列中。
这必须在单个查询中完成,因为我正在otbi分析中使用它。有没有什么方法可以使用union函数来实现这一点?

knsnq2tg

knsnq2tg1#

不需要 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小提琴演示:

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
hjqgdpho

hjqgdpho2#

你可以用 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

相关问题