【发布时间】:2018-07-10 12:42:25
【问题描述】:
我正在尝试创建从变量中获取参数的数据透视子句。
我有一些测试代码,例如:
SELECT * FROM (
SELECT U.USER_ID, U.USER_NAME, E.EXAM_ID, EU.EXAM_DATE
FROM USERS U, EXAMS E, EXAM_USER EU
WHERE U.USER_ID = EU.USER_ID(+)
AND E.EXAM_ID(+) = EU.EXAM_ID
ORDER BY U.USER_ID
)
PIVOT (MAX(EXAM_DATE) FOR EXAM_ID IN ('3' AS "exam 3",'2' AS "exam 2",'1' AS "exam 1"))
order by 1
;
这很好用。然后我将变量 EXAM_IDS 声明为:
DECLARE
EXAM_IDS VARCHAR2 (255);
BEGIN
SELECT LISTAGG('''' || EXAM_ID || ''' AS "' || EXAM_NAME || '"', ',')
WITHIN GROUP (ORDER BY EXAM_ID DESC)
INTO EXAM_IDS
FROM EXAMS;
END;
我很确定变量 EXAM_IDS 现在有一个字符串,用于枢轴子句(?),但我不知道如何将这两者结合起来:
DECLARE
EXAM_IDS VARCHAR2 (255);
BEGIN
SELECT LISTAGG('''' || EXAM_ID || ''' AS "' || EXAM_NAME || '"', ',')
WITHIN GROUP (ORDER BY EXAM_ID DESC)
INTO EXAM_IDS
FROM EXAMS;
END;
SELECT * FROM (
SELECT U.USER_ID, U.USER_NAME, E.EXAM_ID, EU.EXAM_DATE
FROM USERS U, EXAMS E, EXAM_USER EU
WHERE U.USER_ID = EU.USER_ID(+)
AND E.EXAM_ID(+) = EU.EXAM_ID
ORDER BY U.USER_ID
)
PIVOT (MAX(EXAM_DATE) FOR EXAM_ID IN (' || EXAM_IDS || '))
order by 1
;
这不起作用。有没有办法做到这一点,或者我应该只运行两个单独的 SQL 查询?
可以从Using Oracle combine three tables to one with PIVOT找到有关此设置的更多信息(例如我的课程)
【问题讨论】: