Sql 高高在上

Sql 高高在上,sql,oracle,Sql,Oracle,我在甲骨文公司工作。我希望SQL获取一个包含student_id和class列的学生表,并将其变宽,将类按列排序。示例表: SID | CLASS ----+------ 1 | ENG 1 | BIO 2 | MAT 2 | BIO 1 | MAT SID |类 ----+------ 1 |英 1 |生物 2 |垫 2 |生物 1 |垫 我希望输出为: SID | CLASS1 | CLASS2 | CLASS3 ----+--------+--------+-----

我在甲骨文公司工作。我希望SQL获取一个包含student_id和class列的学生表,并将其变宽,将类按列排序。示例表:

SID | CLASS ----+------ 1 | ENG 1 | BIO 2 | MAT 2 | BIO 1 | MAT SID |类 ----+------ 1 |英 1 |生物 2 |垫 2 |生物 1 |垫 我希望输出为:

SID | CLASS1 | CLASS2 | CLASS3 ----+--------+--------+------- 1 | BIO | ENG | MAT 2 | BIO | MAT | SID | 1级| 2级| 3级 ----+--------+--------+------- 1 |生物|工程|材料 2 |生物|垫|
一个附加的特性是,如果我能用NA来填补类的空白。

所以首先,完全公开。我实际上是在尝试为患者提供种族价值观,我只是上了一些课,让它更具相关性。此外,种族是分层的,因此alpha排序不起作用,因此前面的数值(稍后将被丢弃)。这是我的解决方案,使用“with”临时表并在几个连接中为其分配不同的别名

CREATE OR REPLACE FORCE VIEW schema_name.VW_PAT_RACE AS

with pr as
(
select
    r.*
    , rank() over(partition by r.patient_id order by r.r1) as r_num
from
    (
    Select
        patient_id
        , race_c
        , line
        , case
            WHEN race_c = 20 THEN '1HP' 
            WHEN race_c = 14 THEN '2IN' 
            WHEN race_c = 15 THEN '3AS' 
            WHEN race_c = 12 THEN '4BA' 
            WHEN race_c = 11 THEN '5WH' 
            ELSE '7UN'                         /* And always add an Unknown bucket */
        END AS R1
    from
        some_schema.patient_race 
    order by
        patient_id
        , r1
    ) r
)
select distinct
    pr0.patient_id
    , CAST(COALESCE(substr(pr1.r1, 2), 'NA') AS VARCHAR2 (2)) as RACE1
    , CAST(COALESCE(substr(pr2.r1, 2), 'NA') AS VARCHAR2 (2)) as RACE2
    , CAST(COALESCE(substr(pr3.r1, 2), 'NA') AS VARCHAR2 (2)) as RACE3
    , CAST(COALESCE(substr(pr4.r1, 2), 'NA') AS VARCHAR2 (2)) as RACE4
    , CAST(COALESCE(substr(pr5.r1, 2), 'NA') AS VARCHAR2 (2)) as RACE5
from 
    pr pr0
    left join pr pr1
        on pr0.patient_id = pr1.patient_id
        and pr1.r_num = 1
    left join pr pr2
        on pr0.patient_id = pr2.patient_id
        and pr2.r_num = 2
    left join pr pr3
        on pr0.patient_id = pr3.patient_id
        and pr3.r_num = 3 
    left join pr pr4
        on pr0.patient_id = pr4.patient_id
        and pr4.r_num = 4
    left join pr pr5
        on pr0.patient_id = pr5.patient_id
       and pr5.r_num = 5
; 
显然,我本可以跳过PR0,从表中的第一个中提取id、种族和患者id,但不知何故,这似乎澄清了每个种族值的来源。我也为我的高度程式化的代码向老帽程序员道歉,但当我回来做维护时,它会帮助我。
反馈欢迎

通常会有未知数量的类,SQL不会检索未知数量的列。它以行的形式获取数据,您可以使用GUI层(即应用程序或网站)来关注网格中所需的显示。类1或类2或类3是什么?你想按字母顺序排列吗?你可以根据它生成一个CSV。这取决于目的。这样地。如果你知道总有三个或更少的类,那么这只是一个坏主意。如果有超过三门课,这是一个非常糟糕的主意。所以,重要的问题是,为什么要做一些与普通关系数据库模式不同的事情?