4

Oracle 11g でテーブルをローテーションしたいと思います。ピボット オプションには集計が必要です。これは私の元のテーブルです:

project | attribute | value
===========================
'cust1' | 'foo'     | '4'
'cust2' | 'bar'     | 'tbd'
'cust3  | 'baz'     | '2012-06-07'
'cust1' | 'bar'     | 'tdsa'
'cust4' | 'foo'     | '22'
'cust4' | 'baz'     | '2013-01-01'

ピボット後、テーブルは次のようになります。

project | foo | bar | baz
=========================
'cust1' | '4' |'tdba'| NULL
'cust2' | NULL|'tbd' | NULL
'cust3' | NULL| NULL | '2012-06-07'
'cust4' | '22'| NULL | '2013-01-01'

これで、ご覧のとおり、プロジェクト列でグループ化が行われるはずです。値を折りたたんだり計算したりする必要はありません。ただの回転が必要です。では、ピボット選択は正しいことでしょうか?

4

1 に答える 1

7

はい、そう思います。MAX集計を使用すると、次のようなピボットを簡単に実行できます。

SELECT
    *
FROM
(
    SELECT
        project,
        attribute,
        value
    FROM
        table1
) AS SourceTable
PIVOT
(
    MAX(value)
    FOR attribute IN ([foo],[bar],[baz])
) AS pvt

それ以外の場合は、max 集計内で case ステートメントを実行する必要があります。このような:

SELECT
    MAX(CASE WHEN attribute='foo' THEN value ELSE NULL END) AS foo,
    MAX(CASE WHEN attribute='bar' THEN value ELSE NULL END) AS bar,
    MAX(CASE WHEN attribute='baz' THEN value ELSE NULL END) AS baz,
    project
FROM
    table1
GROUP BY
    project

これは、 を行うのとほとんど同じことですPIVOT。しかし、私はPIVOT..CASE WHEN MAXよりも

于 2012-06-07T09:35:53.420 に答える