Oracle 如何在不使用PIVOT的情况下以列与值的形式而不是行的形式获取sql select查询结果
假设我有一张名为student的桌子: 当我从该表中选择时,结果是:Oracle 如何在不使用PIVOT的情况下以列与值的形式而不是行的形式获取sql select查询结果,oracle,Oracle,假设我有一张名为student的桌子: 当我从该表中选择时,结果是: SQL> select * from student; NAME ROLL_NO -------------------- -------------------- gokul 3 gokul1 34 我们能得到这样的输出吗?不使用PIVOT关键字 SQL> select * from student; NAME
SQL> select * from student;
NAME ROLL_NO
-------------------- --------------------
gokul 3
gokul1 34
我们能得到这样的输出吗?不使用PIVOT关键字
SQL> select * from student;
NAME gokul gokul1
ROLL_NO 3 34
答案很简单:不,你不能 在Oracle中,可以执行以下操作,但这不是使用简单的
SELECT*FROM student
可以执行的操作。您需要使用PL/SQL来构建一些动态SQL:
VARIABLE cur REFCURSOR;
DECLARE
p_sql CLOB;
BEGIN
SELECT 'SELECT ''ROLL_NO'' AS "NAME", '
|| LISTAGG(
'MAX( CASE name WHEN '''
|| name
|| ''' THEN roll_no END ) AS "'
|| name || '"',
','
) WITHIN GROUP ( ORDER BY ROWNUM )
|| ' FROM students'
INTO p_sql
FROM students;
OPEN :cur FOR p_sql;
END;
/
PRINT cur;
输出:
NAME gokul gokul1
------- ----------- -----------
ROLL_NO 3 34
编辑
当LISTAGG
输出小于4000字节时,上述代码将起作用,但如果您想查看该值,则需要稍微不同的方法:
VARIABLE cur REFCURSOR;
DECLARE
TYPE name_t IS TABLE OF students.name%type;
p_sql CLOB;
names name_t;
BEGIN
SELECT DISTINCT name
BULK COLLECT INTO names
FROM students;
p_sql := EMPTY_CLOB() || 'SELECT ''ROLL_NO'' AS "NAME"';
FOR i IN 1 .. names.COUNT LOOP
p_sql := p_sql || ', MAX( CASE name WHEN '''
|| names(i)
|| ''' THEN roll_no END ) AS "'
|| names(i)
|| '"';
END LOOP;
p_sql := p_sql || ' FROM students';
OPEN :cur FOR p_sql;
END;
/
PRINT cur;
哦,戈库尔。你什么意思!?您需要的是数据透视表或交叉表(交叉表)查询。对于这个问题,mysql和oracle都有很多答案。可能是@Shadow的重复。这个问题有固定数量的输出列,因此完全可以在SQL中进行透视。除非这个问题局限于一组固定的学生,否则它是关于一个动态轴的,完全不同。在这种情况下,输入表有固定数量的列,而输出表有动态数量的列,因为有动态数量的学生。在您链接的问题中,输入表中有固定数量的列,输出表中有固定数量的列。