Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何在不使用PIVOT的情况下以列与值的形式而不是行的形式获取sql select查询结果_Oracle - Fatal编程技术网

Oracle 如何在不使用PIVOT的情况下以列与值的形式而不是行的形式获取sql select查询结果

Oracle 如何在不使用PIVOT的情况下以列与值的形式而不是行的形式获取sql select查询结果,oracle,Oracle,假设我有一张名为student的桌子: 当我从该表中选择时,结果是: SQL> select * from student; NAME ROLL_NO -------------------- -------------------- gokul 3 gokul1 34 我们能得到这样的输出吗?不使用PIVOT关键字 SQL> select * from student; NAME

假设我有一张名为student的桌子:

当我从该表中选择时,结果是:

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中进行透视。除非这个问题局限于一组固定的学生,否则它是关于一个动态轴的,完全不同。在这种情况下,输入表有固定数量的列,而输出表有动态数量的列,因为有动态数量的学生。在您链接的问题中,输入表中有固定数量的列,输出表中有固定数量的列。