2017-05-17 1 views
0

Ich habe eine Tabelle wie folgt aus:Convert Tabelle von spaltenweise rudern weise Format

entity field_1 field_2 field_3 
1  A 
2    B 
3    E  C 

und ich habe die Tabelle in die folgende Struktur konvertieren:

entity param_id  param_value 
1  paramId_1 A 
2  paramId_2 B 
3  ParamId_2 E 
3  ParamId_3 C 

Wenn Sie das beobachten Tabellen wird die zweite Tabelle basierend auf den in der ersten Tabelle vorhandenen Daten gebildet. Für jede Entität in Tabelle 1 gibt es 3 Spalten. Tabelle 2 darf höchstens 3 Zeilen für höchstens eine Entität enthalten. Die Anzahl der Zeilen hängt von den Nicht-Null-Werten ab, die in der ersten Tabelle vorhanden sind.

Wie kann dies in Oracle erreicht werden? Ich habe versucht, in Google zu suchen, konnte aber keine Hinweise finden.

Antwort

1

Dies ist eine direkte Anwendung von unpivot. null Werte werden während dieses Vorgangs ignoriert.

select entity,case when field='FIELD_1' then 'paramID_1' 
        when field='FIELD_2' then 'paramID_2' 
        when field='FIELD_3' then 'paramID_3' 
       end as param_id, 
param_value    
from t 
unpivot (param_value for field in (field_1,field_2,field_3)) u 
0

Sie könnten auch eine Verbindung alle verwenden, um das gleiche zu erreichen.

SELECT e.entity 
    , e.param_id 
    , param_value = e.field_1 

FROM dbo.entity (NOLOCK) e 

UNION ALL 

SELECT e1.entity 
    , e1.param_id 
    , param_value = e1.field_2 

FROM dbo.entity (NOLOCK) e1 

UNION ALL 

SELECT e2.entity 
    , e2.param_id 
    , param_value = e2.field_3 

FROM dbo.entity (NOLOCK) e2