sql >> Database teknologi >  >> RDS >> Oracle

Oracle SQL Transpose

Jeg vil foreslå at anvende UNPIVOT-funktionen først på dine flere kolonner og derefter bruge row_number() for at oprette dine nye kolonnenavne, der skal bruges i PIVOT.

Den grundlæggende syntaks for unpivot vil være

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;
 

Se SQL Fiddle with Demo . Dette vil konvertere dine flere kolonner med data til flere rækker. Jeg brugte row_number() for at skabe en unik værdi for dine nye kolonnenavne ser dataene fra denne forespørgsel sådan ud:

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

Så kan du anvende PIVOT-funktionen på dette resultat:

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
 

Se SQL Fiddle with Demo . Dette giver et endeligt resultat:

| 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 |

Bemærk, når du anvender unpivot-funktionen, skal datatypen for alle kolonnerne være den samme, så du skal muligvis konvertere dine data i en underforespørgsel, før du kan unpivot den.

UNPIVOT/PIVOT-funktionen blev introduceret i Oracle 11g, hvis du bruger Oracle 10g, så kan du redigere forespørgslen til brug:

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;
 

Se SQL Fiddle with Demo




  1. Sådan opretter du output med to kolonner fra en enkelt kolonne

  2. alternativknapværdi for tilføjelse

  3. karakter til dato i oracle sql

  4. Fejlfinding af SQL Server-transaktionelle replikeringsproblemer