如何在Oracle SQL中透视?

如何在Oracle SQL中透视?,sql,Sql,我有一个属于多个学分组的学生ID列表。 我正试图以一种清晰的方式对它们进行分析。我希望在列中为每个学生及其组信息创建一条记录,列值为YES/NO标志 我目前只能使用以下查询的格式为每个组生成单独的记录: SELECT STUDENT_ID, CASE WHEN CREDIT_ID IN ('1000.00', '0105.00', '0707.00','8009.00', '0809.01') THEN 'YES' END AS GROUP1, CASE WHEN CREDIT_ID IN

我有一个属于多个学分组的学生ID列表。 我正试图以一种清晰的方式对它们进行分析。我希望在列中为每个学生及其组信息创建一条记录,列值为YES/NO标志

我目前只能使用以下查询的格式为每个组生成单独的记录:

SELECT STUDENT_ID, 
CASE WHEN CREDIT_ID IN ('1000.00',  '0105.00', '0707.00','8009.00', '0809.01') THEN 'YES' END AS GROUP1,
CASE WHEN CREDIT_ID IN ('0987.00', '0125.00', '1055.00', '0890.00', '6600.20') THEN 'YES' END AS GROUP2,
CASE WHEN CREDIT_ID IN ('1100.00', '1190.01', '0045.20', '0675.00') THEN 'YES' END AS  GROUP3
FROM STUDENT_TABLE 
WHERE CREDIT_ID IN ('1000.00',  '0105.00', '0707.00','8009.00', '0809.01', '0987.00', '0125.00', '1055.00', '0890.00', '6600.20', '1100.00', '1190.01', '0045.20', '0675.00')
ORDER BY STUDENT_ID;
输出:

STUDENT_ID  GROUP1  GROUP2  GROUP3
1233        YES     null    null
1233        null    YES     null
3456        YES     null    null
3456        null    null    YES
2376        YES     null    null
2376        null    YES     null
3499        YES     null    null
3499        null    YES     null
3499        null    null    YES
我希望它看起来像是:

STUDENT_ID  GROUP1  GROUP2  GROUP3
1233        YES     YES     null
3456        YES     null    YES
2376        YES     YES     null
3499        YES     YES     YES

如何在oracle SQL中实现这一点?有人能帮忙吗?

您应该通过
学生ID
进行聚合,然后使用
案例
表达式的
最大值
,将结果汇总成您想要的结果

SELECT
    STUDENT_ID, 
    MAX(CASE WHEN CREDIT_ID IN ('1000.00',  '0105.00', '0707.00','8009.00', '0809.01') THEN 'YES' END) AS GROUP1,
    MAX(CASE WHEN CREDIT_ID IN ('0987.00', '0125.00', '1055.00', '0890.00', '6600.20') THEN 'YES' END) AS GROUP2,
    MAX(CASE WHEN CREDIT_ID IN ('1100.00', '1190.01', '0045.20', '0675.00') THEN 'YES' END) AS GROUP3
FROM STUDENT_TABLE 
WHERE
    CREDIT_ID IN ('1000.00',  '0105.00', '0707.00','8009.00', '0809.01', '0987.00', '0125.00', '1055.00', '0890.00', '6600.20', '1100.00', '1190.01', '0045.20', '0675.00')
GROUP BY
    STUDENT_ID
ORDER BY
    STUDENT_ID;

这也可以通过使用nvl和group by将其作为子查询来实现:-

使用的虚拟表:-

     with dummy_table as (   
        select  1233  as  "STUDENT_ID",     'YES'as  "GROUP1",   null as  "GROUP2",  null as   "GROUP3" from dual union all
        select 1233  as  "STUDENT_ID",     null as  "GROUP1",  'YES' as  "GROUP2",  null as   "GROUP3" from dual union all
        select 3456  as  "STUDENT_ID",     'YES'as  "GROUP1",   null as  "GROUP2",  null as   "GROUP3" from dual union all
        select 3456  as  "STUDENT_ID",     null as  "GROUP1",  null  as  "GROUP2",  'YES'as   "GROUP3" from dual union all
       select  2376  as  "STUDENT_ID",     'YES'as  "GROUP1",   null as  "GROUP2",  null as   "GROUP3" from dual union all
        select 2376  as  "STUDENT_ID",     null as  "GROUP1",  'YES' as  "GROUP2",  null as   "GROUP3" from dual union all
        select 3499  as  "STUDENT_ID",     'YES'as  "GROUP1",   null as  "GROUP2",  null as   "GROUP3" from dual union all
        select 3499  as  "STUDENT_ID",     null as  "GROUP1",  'YES' as  "GROUP2",  null as   "GROUP3" from dual union all
        select 3499  as  "STUDENT_ID",     null as  "GROUP1",  null  as  "GROUP2", 'YES' as   "GROUP3" from dual)
        select STUDENT_ID, nvl(GROUP1, 'YES') ,nvl(GROUP2, 'YES'),nvl(GROUP3, 'YES') from dummy_table group by STUDENT_ID,nvl(GROUP1, 'YES'),nvl(GROUP2, 'YES'),nvl(GROUP3, 'YES')
使用实际表格

        with stud_table as ( 
                SELECT STUDENT_ID, 
                CASE WHEN CREDIT_ID IN ('1000.00',  '0105.00', '0707.00','8009.00', '0809.01') THEN 'YES' END AS GROUP1,
                CASE WHEN CREDIT_ID IN ('0987.00', '0125.00', '1055.00', '0890.00', '6600.20') THEN 'YES' END AS GROUP2,
                CASE WHEN CREDIT_ID IN ('1100.00', '1190.01', '0045.20', '0675.00') THEN 'YES' END AS  GROUP3
                FROM STUDENT_TABLE 
                WHERE CREDIT_ID IN ('1000.00',  '0105.00', '0707.00','8009.00', '0809.01', '0987.00', '0125.00', '1055.00', '0890.00', '6600.20', '1100.00', '1190.01', '0045.20', '0675.00') )
        select STUDENT_ID, nvl(GROUP1, 'YES') ,nvl(GROUP2, 'YES'),nvl(GROUP3, 'YES') 
          from dummy_table 
         group by STUDENT_ID,nvl(GROUP1, 'YES'),nvl(GROUP2, 'YES'),nvl(GROUP3, 'YES')
         order by STUDENT_ID;