sql >> データベース >  >> RDS >> Oracle

Oracle SQL Transpose

    最初にUNPIVOT関数を複数の列に適用してから、row_number()を使用することをお勧めします。 PIVOTで使用される新しい列名を作成します。

    unpivotの基本的な構文は次のようになります

    select field, 
      value,
      'value'||
       to_char(row_number() over(partition by field
                                  order by value)) seq
    from yourtable
    unpivot
    (
      value
      for field in (Name, Age, Sex, DOB, col1, col2, col3)
    ) u;
    

    SQL Fiddle withDemo を参照してください。 。これにより、データの複数の列が複数の行に変換されます。 row_number()を使用しました 新しい列名に一意の値を作成するには、このクエリのデータは次のようになります。

    | FIELD |                   VALUE |    SEQ |
    |-------|-------------------------|--------|
    |   AGE |                      12 | value1 |
    |   AGE |                      15 | value2 |
    |  COL1 |                      aa | value1 |
    |  COL1 |                      xx | value2 |
    

    次に、PIVOT関数をこの結果に適用できます。

    select field, value1, value2
    from
    (
      select field, 
        value,
        'value'||
          to_char(row_number() over(partition by field
                                    order by value)) seq
      from yourtable
      unpivot
      (
        value
        for field in (Name, Age, Sex, DOB, col1, col2, col3)
      ) u
    ) d
    pivot
    (
      max(value)
      for seq in ('value1' as value1, 'value2' as value2)
    ) piv
    

    SQL Fiddle withDemo を参照してください。 。これにより、最終結果が得られます:

    | FIELD |                  VALUE1 |                  VALUE2 |
    |-------|-------------------------|-------------------------|
    |   AGE |                      12 |                      15 |
    |  COL1 |                      aa |                      xx |
    |  COL2 |                      bb |                      yy |
    |  COL3 |                      cc |                      zz |
    |   DOB | 07-Aug-2001 12:00:00 AM | 26-Aug-2001 12:00:00 AM |
    |  NAME |                       A |                       B |
    |   SEX |                       F |                       M |
    

    unpivot関数を適用する場合、すべての列のデータ型が同じである必要があるため、ピボットを解除する前にサブクエリでデータを変換する必要がある場合があることに注意してください。

    UNPIVOT /PIVOT関数はOracle11gで導入されました。Oracle10gを使用している場合は、クエリを編集して使用できます。

    with cte as
    (
      select 'name' field, name value
      from yourtable
      union all
      select 'Age' field, Age value
      from yourtable
      union all
      select 'Sex' field, Sex value
      from yourtable
      union all
      select 'DOB' field, DOB value
      from yourtable
      union all
      select 'col1' field, col1 value
      from yourtable
      union all
      select 'col2' field, col2 value
      from yourtable
      union all
      select 'col3' field, col3 value
      from yourtable
    )
    select
      field,
      max(case when seq = 'value1' then value end) value1,
      max(case when seq = 'value2' then value end) value2
    from
    (
      select field, value,
      'value'||
          to_char(row_number() over(partition by field
                                    order by value)) seq
      from cte
    ) d
    group by field;
    

    SQL Fiddle withDemo を参照してください。




    1. Ubuntuでのmysqlft_min_word_lenの変更が機能しない

    2. ON DUPLICATE KEY UPDATE の説明が必要な SQL クエリ

    3. setval()がリレーションで失敗するのはなぜですか...存在しませんか?

    4. MySQLテーブルの列データを下にシフトすることは可能ですか?