この文を行ではなく列として戻すことはできますか?おそらくピボットクエリを使用していますか?oracleの単一行から単一列への変換
select * from MYTABLE Where SOMECOLUMN = RESULT THAT RETURNS ONE RECORD
この文を行ではなく列として戻すことはできますか?おそらくピボットクエリを使用していますか?oracleの単一行から単一列への変換
select * from MYTABLE Where SOMECOLUMN = RESULT THAT RETURNS ONE RECORD
私はあなたのようにそれを呼び出すことができますので、それはテーブルを返し、あなたが望むものを作る簡単な関数を作った:例としては、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
あなたの目的のためにあなたは動的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 ;
すべての列の型が同じではないので、これはうまくいかないようです。とにかくありがとう: -/ –
ちょっと私はあなたの列を単一のデータ型に変換する方法を示す私の答えを変更しました。私は文字列に整数であるempnoを変換するためにTO_CHARを使用しました。 –
その単一の行の各列は、1つの列を持つ独自の行と同じ意味ですか?すでに知っているように、ピボット操作(またはピボット解除)があります。あなたは何を試しましたか?どのOracleのバージョンですか?列にはどのようなデータ型がありますか? –
今日、ピボット操作が検出されました。すべての列名を指定せずに1つの行を1つの列に変換できるようにするには、テーブルに140列あります。そこから私はuser_tab_columns.column_nameで別の列を追加しようとしていますので、列名とその値を並べることができます。 –