动态旋转表 Oracle

2023-09-20数据库问题
3

本文介绍了动态旋转表 Oracle的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我有一张看起来像这样的表格:

I have a table that looks like this:

C_ID   P_ID   KEY    VALUE
null   null   KEY1   VALUE1
null   null   KEY2   VALUE2
null   null   KEY3   VALUE3
2       2     KEY4   VALUE4
2       3     KEY5   VALUE5

我想得到这个结果表/视图:

I want to get this result table/view:

C_ID   P_ID   KEY1    KEY2    KEY3      KEY4    KEY5
NULL   NULL  VALUE1  VALUE2  VALUE3     NULL    NULL
2       2     NULL    NULL    NULL     VALUE4   NULL
2       3     NULL    NULL    NULL      NULL   VALUE5

有人知道我如何实现这一目标吗?我已经试过了:

Has anybody an Idea how I could achieve this? I have tried it with:

select * from (select c_id, p_id, r_key, r_value from s_projectroles) pivot (max(r_value) for r_key in (any));

我有一个错误:

ORA-00936: Ausdruck fehlt
00936. 00000 -  "missing expression"

推荐答案

这可以通过以下方式动态完成.首先,这里是查询的静态版本,因此您可以看到最终的 sql:

This can be done dynamically the following way. First, here is the static version of the query so you can see the final sql:

select c_id,
  p_id,
  max(case when r_key= 'KEY1' then r_value  end) KEY1,
  max(case when r_key= 'KEY2' then r_value  end) KEY2,
  max(case when r_key= 'KEY3' then r_value  end) KEY3,
  max(case when r_key= 'KEY4' then r_value  end) KEY4,
  max(case when r_key= 'KEY5' then r_value  end) KEY5
from s_projectroles
group by c_id, p_id

参见SQL Fiddle with Demo

然后要动态执行此操作,您可以创建以下过程:

Then to do this dynamically, you can create the following procedure:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select c_id, P_id ';

    begin
        for x in (select distinct r_key from s_projectroles order by 1)
        loop
            sql_query := sql_query ||
              ' , max(case when r_key = '''||x.r_key||''' then r_value end) as '||x.r_key;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from s_projectroles group by c_id, p_id';

        open p_cursor for sql_query;
    end;
/

然后执行它:

variable x refcursor
exec dynamic_pivot(:x)
print x

结果是一样的:

|   C_ID |   P_ID |   KEY1 |   KEY2 |   KEY3 |   KEY4 |   KEY5 |
----------------------------------------------------------------
| (null) | (null) | VALUE1 | VALUE2 | VALUE3 | (null) | (null) |
|      2 |      2 | (null) | (null) | (null) | VALUE4 | (null) |
|      2 |      3 | (null) | (null) | (null) | (null) | VALUE5 |

这篇关于动态旋转表 Oracle的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

SQL 子句“GROUP BY 1"是什么意思?意思是?
What does SQL clause quot;GROUP BY 1quot; mean?(SQL 子句“GROUP BY 1是什么意思?意思是?)...
2024-04-16 数据库问题
62

为什么 Mysql 的 Group By 和 Oracle 的 Group by 行为不同
Why Mysql#39;s Group By and Oracle#39;s Group by behaviours are different(为什么 Mysql 的 Group By 和 Oracle 的 Group by 行为不同)...
2024-04-16 数据库问题
13

如何在MySQL中为每个组选择第一行?
How to select the first row for each group in MySQL?(如何在MySQL中为每个组选择第一行?)...
2024-04-16 数据库问题
13

MySQL - 获取最低值
MySQL - Fetching lowest value(MySQL - 获取最低值)...
2024-04-16 数据库问题
8

在 cmakelist.txt 中添加和链接 mysql 库
Add and link mysql libraries in a cmakelist.txt(在 cmakelist.txt 中添加和链接 mysql 库)...
2024-04-16 数据库问题
41

考勤数据库的良好数据库设计(架构)是什么?
What is a good database design (schema) for a attendance database?(考勤数据库的良好数据库设计(架构)是什么?)...
2024-04-16 数据库问题
7