oracle - 使用两个动态值在 oracle v10.2.0 上进行透视
问题描述
我需要得到这样的查询结果:
|Person1 |Person2 |Person3 |...
------------------------------------------------------------------------------------
Date1 |function(Person1Id,Date1)|function(Person2Id,Date1)|function(Person3Id,Date1)|...
Date2 |function(Person1Id,Date2)|function(Person2Id,Date2)|function(Person3Id,Date2)|...
Date3 |function(Person1Id,Date3)|function(Person2Id,Date3)|function(Person3Id,Date3)|...
.
.
.
日期来自用户,PersonIds 来自表。我需要做的只是发送函数的 id 和日期并得到它的结果。由于我正在研究 oracle v10.2.0,因此旋转不起作用并且编写案例......当每个人的陈述都不起作用时,因为我要获取的表中有很多人。
任何帮助表示赞赏。
解决方案
您可以在数据库版本中使用条件聚合,10g
例如
SELECT myDate,
MAX(CASE WHEN PersonId=1 THEN myfunc(PersonId,myDate) END) AS Person1,
MAX(CASE WHEN PersonId=2 THEN myfunc(PersonId,myDate) END) AS Person2,
MAX(CASE WHEN PersonId=3 THEN myfunc(PersonId,myDate) END) AS Person3
FROM t
GROUP BY myDate
更新:然而,存在一个选项,即使在 DB中也10g
可以通过使用来进行动态旋转SYS_REFCURSOR
,例如。使用 PL/SQL 而不是仅使用 SQL,如果您使用的是 SQL Developer,则在命令行上显示结果集。创建存储函数
CREATE OR REPLACE FUNCTION get_person_rs RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_str VARCHAR2(32767);
BEGIN
WITH tt AS
(
SELECT PersonId,
ROW_NUMBER() OVER (ORDER BY PersonId) AS rn
FROM t
GROUP BY PersonId
)
SELECT TO_CHAR(RTRIM(XMLAGG(XMLELEMENT(e,
'MAX(CASE WHEN PersonId = '||PersonId||
' THEN myfunc(PersonId,myDate)
END) AS Person'||rn
, ',')).EXTRACT('//text()').GETCLOBVAL(), ','))
INTO v_str
FROM tt;
v_sql :=
'SELECT myDate, '|| v_str ||'
FROM t
GROUP BY myDate';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
其中,ROW_NUMBER()
使用了 中可用的解析函数,10g
但LISTAGG()
中还没有字符串聚合函数10g
。所以XMLAGG
改为使用。函数中生成的这个 SQL 字符串也与上面的完全相同,例如。在条件聚合逻辑中。
然后运行以下代码:
VAR rc REFCURSOR
EXEC :rc := get_person_rs;
PRINT rc
从 SQL Developer 的命令行中查看由当前现有数据动态生成的预期结果集。
推荐阅读
- swift - Int 和 Unwrapped Int 的区别
- swift - 在哪里放置更新核心数据功能(swift)
- excel - 如何在 Laravel 和 maatwebsite 3.0 中使用搜索值从视图中导出数据
- r - 如何使用 R 中的 data.table 构建更改表?
- testng - 使用 testng xml 并行运行 LeanFT 测试
- owasp - 如何在 zap API 客户端中将身份验证方法设置为基于 json 的 POST 请求数据?
- android - 尝试打开相机安卓时崩溃?
- java - 通话录音,通话多个(重复)电话阶段并创建多个音频文件
- swift - 结构是文件私有的,不能从 swift 4.1 中的默认参数值引用
- angular - 在 Angular 2 中,我从后端获得响应...我在 html 文件中的 *ngFor 中循环它