2

データベーステーブルがあります。さらに、データが特定の形式であることがわかりました。クエリを使用して一時テーブルを直接作成せずに次の変換を実行する方法は?col2 は静的フィールド X および Y ではなく、動的に決定されます。つまり、列の数は動的ではありません。 ここに画像の説明を入力

4

2 に答える 2

2

使用している Oracle のバージョンを指定しなかったため、ここにいくつかの解決策を示します。

Oracle 11g+ を使用している場合は、次のPIVOT関数にアクセスできます。

select *
from
(
  select col1, col2, col3
  from yourtable
) src
pivot
(
  max(col3)
  for col2 in ('X', 'Y')
) piv

デモで SQL Fiddle を参照してください

別のバージョンの Oracle を使用している場合は、CASEステートメントで集計関数を使用できます。

select col1,
  min(case when col2 = 'X' then col3 end) X,
  min(case when col2 = 'Y' then col3 end) Y
from yourtable
group by col1

デモで SQL Fiddle を参照してください

値の数が不明な場合はcol2、Oracle で動的 SQL を生成するプロシージャを作成できます。

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select col1 ';

    begin
        for x in (select distinct col2 from yourtable order by 1)
        loop
            sql_query := sql_query ||
                ' , min(case when col2 = '''||x.col2||''' then col3 end) as '||x.col2;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from yourtable group by col1';

        open p_cursor for sql_query;
    end;
/

それを実行するには:

variable x refcursor
exec dynamic_pivot(:x)
print x

結果は同じになります。

| COL1 |  X  |  Y |
--------------------
|    A |   1 |   3 |
|    B |   2 |   4 |
于 2012-11-08T10:29:44.817 に答える
1
select 
  col1 " ",
  sum(case when col2='X' then col3 else 0 end) x,
sum(case when col2='Y' then col3 else 0 end) y
from sample
group by col1

==

この問題の SQL Fiddle デモ

SQL フィドルのスクリーンショット

于 2012-11-08T10:34:43.107 に答える