2016-05-11 14 views
0

この文を行ではなく列として戻すことはできますか?おそらくピボットクエリを使用していますか?oracleの単一行から単一列への変換

select * from MYTABLE Where SOMECOLUMN = RESULT THAT RETURNS ONE RECORD 
+0

その単一の行の各列は、1つの列を持つ独自の行と同じ意味ですか?すでに知っているように、ピボット操作(またはピボット解除)があります。あなたは何を試しましたか?どのOracleのバージョンですか?列にはどのようなデータ型がありますか? –

+0

今日、ピボット操作が検出されました。すべての列名を指定せずに1つの行を1つの列に変換できるようにするには、テーブルに140列あります。そこから私はuser_tab_columns.column_nameで別の列を追加しようとしていますので、列名とその値を並べることができます。 –

答えて

1

私はあなたのようにそれを呼び出すことができますので、それはテーブルを返し、あなたが望むものを作る簡単な関数を作った:例としては、EMP表の行が返されます、(mypkg.RowToCol)TABLE SELECT * FROMエネムは "キング"です。

create or replace PACKAGE mypkg AS 
    TYPE ColTypRec IS RECORD (field_value varchar2(100),field_name Varchar2(100)); 
    TYPE ColTyp IS TABLE of ColTypRec; 
end; 

FUNCTION RowToCol RETURN ColTyp PIPELINED AS 
c sys_refcursor; 
col_tochar_names varchar(500); 
col_names  varchar(500); 
data    ColTypRec; 
begin 
--usage select * from TABLE(mypkg.RowToCol) 
SELECT RTRIM (XMLAGG (XMLELEMENT (e, 'TO_CHAR('||column_name||') as '||column_name || ',')).EXTRACT ('//text()'), ',') , 
     RTRIM (XMLAGG (XMLELEMENT (e, column_name || ',')).EXTRACT ('//text()'), ',') 
     INTO col_tochar_names, col_names 
FROM USER_TAB_COLS WHERE table_name='EMP'; 
--dbms_output.put_line(col_tochar_names); 
--dbms_output.put_line(col_names); 
Open c for 'SELECT fieldvalue,fieldname from (' || 
      ' SELECT '||col_tochar_names || 
      ' FROM emp where emp.ename=''KING'' '|| 
      ') '|| 
      ' UNPIVOT INCLUDE NULLS (fieldvalue FOR fieldname IN ('||col_names||')) '|| 
      'order by fieldname'; 
LOOP 
    FETCH c INTO data; 
    EXIT WHEN c%NOTFOUND; 
    PIPE ROW(data); 
END LOOP; 
CLOSE c; 
end; 
end; --Body Package 
2

あなたの目的のためにあなたは動的SQL variabile文字列を作成することができますし、ストアド・プロシージャ内でそれを実行し、そのvariabileは、私はこのテキストの下にお見せしますが、1のように、ピボットクエリに必要なすべてのフィールド名を連結しなければなりません。

例として、emp.name = 'KING'のテーブルから1行だけを抽出した後、UNPIVOT文を使用して転置します。転記する列の名前はENAME、JOB、EMPNOですが、他の列を転置することもできます。列を同じデータ型に変換する必要があります。これらは1列に収まる必要があるため、例ではTO_CHAR(empno)を使用しました。私はメイン・セレクトでもフィールド名を返しましたが、省略することができます。それが役に立てば幸い。

select fieldvalue,fieldname from (
    SELECT ename,job,to_char(empno) as empno 
    FROM emp where emp.ename='KING' 
    ) 
    UNPIVOT (fieldvalue FOR fieldname IN (ename as 'ENAME', job as 'JOB', empno as 'EMPNO')) 
    order by fieldname ; 
+0

すべての列の型が同じではないので、これはうまくいかないようです。とにかくありがとう: -/ –

+0

ちょっと私はあなたの列を単一のデータ型に変換する方法を示す私の答えを変更しました。私は文字列に整数であるempnoを変換するためにTO_CHARを使用しました。 –

関連する問題