1

次の構造のテーブル列があります。

|------ ID ------|
|-  1.20.10.00  -|
|-  1.20.10.10  -|
|-  1.20.10.20  -|
|-  1.20.20.00  -|
|-  1.20.20.10  -|
|-  1.40.10.00  -|
|-  1.40.20.00  -|
|-  1.60.10.00  -|
|-  1.60.10.00  -|

文字列によって返される個別の値に基づいてデータを複数の列にピボットするクエリを実行しようとしています。値の左の 5 文字のように、列名は like ステートメントで使用される 5 文字と一致します。私が到達したいものの例を示しましょう:

|----- 1.20. ----||----- 1.40. ----||----- 1.60. ----|
|-  1.20.10.00  -||-  1.40.10.00  -||-  1.60.10.00  -|
|-  1.20.10.10  -||-  1.40.20.00  -||-  1.60.10.00  -|
|-  1.20.10.20  -|
|-  1.20.20.00  -|
|-  1.20.20.10  -|

私は Oracle 11g データベースを使用しているので、PIVOT コマンドを使用する必要があると考えましたが、DISTINCT および LIKE コマンドを追加して設定する方法がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

1

row_number() over()オプション番号 1 として、分析関数、max()集計関数、およびcase式の組み合わせを使用できます。

select max(case when substr(col, 1, 4) = '1.20' then col end) as "1.20"
     , max(case when substr(col, 1, 4) = '1.40' then col end) as "1.40"
     , max(case when substr(col, 1, 4) = '1.60' then col end) as "1.60"
 from (select col
            , row_number() over(partition by substr(col, 1, 4) 
                                    order by substr(col, 1, 4)) as rn
        from t1)
group by rn

結果:

1.20       1.40       1.60     
---------- ---------- ----------
1.20.10.00 1.40.10.00 1.60.10.00 
1.20.10.10 1.40.20.00 1.60.10.00 
1.20.20.00                       
1.20.20.10                       
1.20.10.20                       

注: 考えられる列エイリアスの適切な選択ではありません。

pivot別のオプションとして、Oracle 11g バージョンで導入された演算子を使用できます。

select "1.20"
     , "1.40"
     , "1.60"
       from (select col
                  , substr(col, 1, 4) as common_part
                  , row_number() over(partition by substr(col, 1, 4) 
                                          order by substr(col, 1, 4)) as rn
              from t1)
pivot(
  max(col) for common_part in ( '1.20' as "1.20"
                              , '1.40' as "1.40"
                              , '1.60' as "1.60")
)

結果:

1.20       1.40       1.60     
---------- ---------- ----------
1.20.10.00 1.40.10.00 1.60.10.00 
1.20.10.10 1.40.20.00 1.60.10.00 
1.20.20.00                       
1.20.20.10                       
1.20.10.20                       
于 2013-11-01T18:54:03.353 に答える