Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Mehrere Zeilenwerte in einer einzelnen Zeile

Sie müssen noch etwas mehr Arbeit leisten, bevor Sie so schwenkbar sind, da beim Schwenken Zeilendaten in Spaltennamen umgewandelt werden, aber keine Ihrer Zeilendaten 1, 2, 3, 4... ist als Spaltenname zu verwenden (inp_value1 <-- die 1 hier)

Sie können dies tun, was wahrscheinlich einfacher zu verstehen ist:

SELECT
  Empid,
  Ele_name,
  MAX(CASE WHEN rown = 1 THEN Inp_name END) as Inp_name1,
  MAX(CASE WHEN rown = 1 THEN Inp_value END) as Inp_Value1,
  MAX(CASE WHEN rown = 2 THEN Inp_name END) as Inp_name2,
  MAX(CASE WHEN rown = 2 THEN Inp_value END) as Inp_Value2,
  MAX(CASE WHEN rown = 3 THEN Inp_name END) as Inp_name3,
  MAX(CASE WHEN rown = 3 THEN Inp_value END) as Inp_Value3,
  MAX(CASE WHEN rown = 4 THEN Inp_name END) as Inp_name4,
  MAX(CASE WHEN rown = 4 THEN Inp_value END) as Inp_Value4,
  MAX(CASE WHEN rown = 5 THEN Inp_name END) as Inp_name5,
  MAX(CASE WHEN rown = 5 THEN Inp_value END) as Inp_Value5,
  MAX(CASE WHEN rown = 6 THEN Inp_name END) as Inp_name6,
  MAX(CASE WHEN rown = 6 THEN Inp_value END) as Inp_Value6,
  EntryId,     
  Start_date,      
  End_Date
FROM
  (SELECT t2.*, ROW_NUMBER() OVER(PARTITION BY EmpId, Ele_name ORDER BY 1) as rown FROM t2) d
GROUP BY 
  Empid,
  Ele_name, 
  EntryId,     
  Start_date,      
  End_Date
  • ps; Warum geben Sie name3/4/5/6 in Ihrer erwarteten Ausgabe an, wenn sie alle null sind? Wenn die Daten nie mehr als 2 Zeilen pro empid/ele_name-Paar haben, können Sie einfach null as input_name3.. schreiben und so weiter
  • pps:ich habe meinen tisch t2 genannt - bearbeite deinen namen in der abfrage
  • pps; Ich weiß nicht, ob die Spalte "Enddatum" wirklich ein Leerzeichen im Namen hat, ich habe meine mit einem Unterstrich aufgerufen

Oder Sie können so schwenken (schwerer zu verstehen, aber kompakter):

SELECT
  Empid,
  Ele_name,
  pvt.*,
  EntryId,     
  Start_date,      
  End_Date
FROM
  (SELECT t2.*, ROW_NUMBER() OVER(PARTITION BY EmpId, Ele_name ORDER BY 1) as rown
   FROM t2) d
PIVOT( 
  MAX(inp_name) as inp_name, 
  MAX(inp_value) as inp_value 
  FOR rown in (1,2,3,4,5,6) 
) pvt

aber die Spalten kommen aus pvt.* mit Namen wie 1_inp_name, 1_inp_value .. Sie müssen AS verwenden um sie umzubenennen