Oracle
 sql >> Base de données >  >> RDS >> Oracle

Valeurs de plusieurs lignes dans une seule ligne

Vous devez faire un peu plus de travail avant de pouvoir pivoter comme ça, car le pivotement prend les données de ligne et les transforme en noms de colonne, mais aucune de vos données de ligne n'est 1, 2, 3, 4... à utiliser comme nom de colonne (inp_value1 <-- le 1 ici)

Vous pouvez le faire, ce qui est probablement plus facile à comprendre :

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 ; pourquoi spécifier name3/4/5/6 dans votre sortie attendue s'ils sont tous nuls ? Si les données n'auront jamais plus de 2 lignes par paire empid/ele_name, vous pouvez simplement écrire null as input_name3.. et ainsi de suite
  • pps :j'ai appelé ma table t2 - modifiez votre nom dans la requête
  • ppp ; Je ne sais pas si la colonne "date de fin" a vraiment un espace dans le nom, j'ai appelé la mienne avec un trait de soulignement

Ou vous pouvez pivoter comme ceci (plus difficile à comprendre mais plus compact) :

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

mais les colonnes sortiront du pvt.* avec des noms comme 1_inp_name, 1_inp_value .. Vous devrez utiliser AS pour les renommer