0

私はこのようなテーブルを持っています:

+-------+-------+-------+-------+
|  ID   | City  | Param | Value |
+-------+-------+-------+-------+
| id1   | city1 | a     | value |
| id2   | city1 | b     | value |
| id3   | city1 | c     | value |
| id4   | city2 | a     | value |
| id5   | city2 | b     | value |
| id6   | city2 | c     | value |
| ...   | ...   | ...   | ...   |
| idN   | cityN | a     | value |
| idN+1 | cityN | b     | value |
| idN+2 | cityN | c     | value |
+-------+-------+-------+-------+

ご覧のとおり、次のような各都市のサブテーブルがあります。

+-------+-------+
| Param | Value |
+-------+-------+
| a     | value |
| b     | value |
| c     | value |
+-------+-------+

したがって、すべてのサブテーブルを結合して、次のようなテーブルを取得したいと思います。

+-------+-------+-------+-----+-------+
| Param | city1 | city2 | ... | cityN |
+-------+-------+-------+-----+-------+
| a     | value | value | ... | value |
| b     | value | value | ... | value |
| c     | value | value | ... | value |
+-------+-------+-------+-----+-------+

どうすればそれを手に入れることができるかアイデアはありますか?

前もって感謝します!

注1:都市の数は変動します。

注2:解決策はPL/SQL関数である可能性があります。

4

2 に答える 2

1

必要な結果を得るには、データをピボットする必要があります。plsqlはオプションである可能性があると述べましたが、使用しているOracleのバージョンを指定していません。Oracle 11g以降、このPIVOT関数が使用可能になりました。

Oracle 119を使用していない場合は、次のCASE式で集計関数を使用できます。

select param,
    max(case when city = 'city1' then value end) City1,
    max(case when city = 'city2' then value end) City2
from yourtable
group by param

SQL FiddlewithDemoを参照してください。

値の数が不明であると述べているcityため、このクエリの動的SQLバージョンを作成する必要があります。次のような手順を作成できます。

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

    begin
        for x in (select distinct city from yourtable order by 1)
        loop
            sql_query := sql_query ||
                ' , max(case when city = '''||x.city||''' then value else null end) as '||x.city;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from yourtable group by param order by param';
        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

次に、結果を取得するために、次を使用できます(注:これはTOADで使用しました)。

variable x refcursor
exec dynamic_pivot(:x)
print x

そして、クエリの結果は次のようになります。

| PARAM | CITY1 | CITY2 |
-------------------------
|     a | value | value |
|     b | value | value |
|     c | value | value |
于 2013-02-15T17:02:29.330 に答える
0

pivot11Gのnewまたはmodel10Gの場合は句を使用できます。ドキュメントを確認してください。

于 2013-02-15T21:17:54.587 に答える