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

Valori di più righe in una singola riga

Devi fare ancora un po' di lavoro prima di poter ruotare in questo modo, perché il pivot prende i dati di riga e li trasforma in nomi di colonna, ma nessuno dei tuoi dati di riga è 1, 2, 3, 4... da utilizzare come nome di colonna (inp_value1 <-- qui 1)

Puoi farlo, che è probabilmente più facile da capire:

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; perché specificare name3/4/5/6 nell'output previsto se sono tutti nulli? Se i dati non avranno mai più di 2 righe per coppia empid/ele_name, puoi semplicemente scrivere null as input_name3.. e così via
  • pps:ho chiamato il mio tavolo t2 - modifica il tuo nome nella query
  • ppps; Non so se la colonna "data di fine" ha davvero uno spazio nel nome, ho chiamato il mio con un trattino basso

Oppure puoi ruotare in questo modo (più difficile da capire ma più compatto):

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

ma le colonne usciranno da pvt.* con nomi come 1_inp_name, 1_inp_value .. Dovrai usare AS per rinominarli