如何在Oracle SQL中透视?
我有一个属于多个学分组的学生ID列表。 我正试图以一种清晰的方式对它们进行分析。我希望在列中为每个学生及其组信息创建一条记录,列值为YES/NO标志 我目前只能使用以下查询的格式为每个组生成单独的记录:如何在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
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;