1

次の表のより複雑なバージョンがあります。

ID | FIRST  | LAST     | EMAIL
1  | John   | Doe      | jdoe@example.com
1  | Mack   | Johnson  | mjohnson@example.com
1  | Steven | Michaels | smichaels@example.com
2  | Sarah  | Sampson  | ssampson@example.com
2  | Tom    | Smith    | tsmith@example.com
2  | Jane   | Rogers   | jrogers@example.com
3  | Bob    | Johns    | bjohns@example.com
3  | Kim    | Lane     | klane@example.com
3  | Ron    | Swanson  | rswanson@example.com

このデータを別のテーブルに挿入して次のようにするクエリを作成したいと思います (テーブルは既に存在します)。

ID | first1 | last1    | email1               | first2 | last2    | email2               | first3 | last3    | email3 
1  | John   | Doe      | jdoe@example.com     | Mack   | Johnson  | mjohnson@example.com | Steven | Michaels | smichaels@example.com
2  | Sarah  | Sampson  | ssampson@example.com | Tom    | Smith    | tsmith@example.com   | Jane   | Rogers      | jrogers@example.com
3  | Bob    | Johns    | bjohns@example.com   | Kim    | Lane     | klane@example.com    | Ron    | Swanson     | rswanson@example.com

これは簡単なはずですが、コンセプトがわかりません。これを達成するためのベストプラクティスは何ですか?

ID、インデックス番号、列名を渡して値を返すことができる関数を作成したことにも言及する必要があるかもしれません (つまり、getpersoninfo(2,'1','first') で Sarah を返します)。

select a_id,
  FIRST1, LAST1, EMAIL1,
  FIRST2, LAST2, EMAIL2,
  FIRST3, LAST3, EMAIL3
from
(
  select a_id, col||rn as new_col, value
  from
  (
    select a_id, first_name, last_name, email,
      cast(row_number() over(partition by a_id order by a_id) as varchar2(10)) rn
    from dump_recs_2015
  ) 
  unpivot
  (
    value
    for col in (first_name, last_name, email)
  )
) 
pivot
(
  max(value)
  for new_col in ('FIRST1' FIRST1, 'LAST1' LAST1, 'EMAIL1' EMAIL1,
                  'FIRST2' FIRST2, 'LAST2' LAST2, 'EMAIL2' EMAIL2,
                  'FIRST3' FIRST3, 'LAST3' LAST3, 'EMAIL3' EMAIL3)
);
4

1 に答える 1

2

Oracle 11g を使用しているため、UNPIVOTPIVOT関数の両方を実装できます。

は列をUNPIVOT取り、値を行に変換します。次に、新しい名前などを列に入れることができます:firstlastemailPIVOTFirst1

select id,
  First1, Last1, Email1,
  First2, Last2, Email2,
  First3, Last3, Email3
from
(
  select id, col||rn as new_col, value
  from
  (
    select id, first, last, email,
      cast(row_number() over(partition by id order by id) as varchar2(10)) rn
    from yourtable
  ) 
  unpivot
  (
    value
    for col in (first, last, email)
  )
) 
pivot
(
  max(value)
  for new_col in ('FIRST1' First1, 'LAST1' Last1, 'EMAIL1' Email1,
                  'FIRST2' First2, 'LAST2' Last2, 'EMAIL2' Email2,
                  'FIRST3' First3, 'LAST3' Last3, 'EMAIL3' Email3)
) 

SQL Fiddle with Demoを参照してください。これをINSERTステートメントで使用して、データを新しいテーブルにロードできます。

編集、列名の変更に基づいて、次を使用します。

select a_id,
  First1, Last1, Email1,
  First2, Last2, Email2,
  First3, Last3, Email3
from
(
  select a_id, col||rn as new_col, value
  from
  (
    select a_id, first_name, last_name, email,
      cast(row_number() over(partition by a_id order by a_id) as varchar2(10)) rn
    from yourtable
  ) 
  unpivot
  (
    value
    for col in (first_name, last_name, email)
  )
) 
pivot
(
  max(value)
  for new_col in ('FIRST_NAME1' First1, 'LAST_NAME1' Last1, 'EMAIL1' Email1,
                  'FIRST_NAME2' First2, 'LAST_NAME2' Last2, 'EMAIL2' Email2,
                  'FIRST_NAME3' First3, 'LAST_NAME3' Last3, 'EMAIL3' Email3)
) 

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

于 2013-03-20T20:44:14.797 に答える