sql - 使用 PIVOT 函数 (Oracle) 的行到列

标签 sql string oracle pivot

我正在尝试创建一个查询以使用 PIVOT 函数将行转换为列。我有一个这种形式的表格(这只是部分 View ,该表格包含 30 多列)。

ID      SUBJECT  GRADE
000442  WRI001   C-
000442  PHY104   C
000442  MTH111   B
000442  MTH111   W
000442  MTH111   W
000442  PHY104   W
预期结果:
ID      'WRI001'   'MTH111'   'PHY104'
000442   C-         B,W,W      C,W
使用的查询:
select * from (
   select ID,
          SUBJECT,GRADE
   from SECOND_YEAR_COMP
             )
pivot 
(
   MAX(GRADE)
   for SUBJECT in
   ('MTH111',
    'WRI001',
    'PHY104')
);
查询输出:
ID      'WRI001'   'MTH111'   'PHY104'
000442   C-         W          W
我知道因为 MAX(GRADE),我每个科目都只有一个成绩。有没有办法获得该科目的所有成绩(正如我上面给出的预期结果)。

最佳答案

您可以使用 listagg()和条件聚合:

select id,
    listagg(case when subject = 'WRI001' then grade end) WRI001,
    listagg(case when subject = 'WRI001' then grade end) WRI001,
    listagg(case when subject = 'PHY104' then grade end) PHY104
from second_year_comp
group by id
您可以使用 within group 控制成绩出现在串联字符串中的顺序。条款。假设您想按年级排序,然后:
select id,
    listagg(case when subject = 'WRI001' then grade end) within group(order by grade) WRI001,
    listagg(case when subject = 'WRI001' then grade end) within group(order by grade) WRI001,
    listagg(case when subject = 'PHY104' then grade end) within group(order by grade) PHY104
from second_year_comp
group by id

关于sql - 使用 PIVOT 函数 (Oracle) 的行到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64390380/

相关文章:

java - JPA查询返回实体列表

java - 我将如何分割这个输入的字符串? ( java )

java - 直接从 Web 服务调用获取 UTF8 字符串,无需转换为 String

Java - 创建 Oracle 日期字段

oracle - 找出PL/SQL过程的名称

MySQL select语句以循环方式返回结果

mysql - 同表同列不同条件查询

sql-server - 为什么我的 SSIS 包中的连接不断丢失?

php - 即使使用请求中定义的格式也获取 "Invalid datetime format"

php - 添加带逗号的数字字符串