Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Valores de várias linhas em uma única linha


Você precisa fazer um pouco mais de trabalho antes de poder dinamizar assim, porque a dinamização pega dados de linha e os transforma em nomes de coluna, mas nenhum de seus dados de linha é 1, 2, 3, 4... para usar como um nome de coluna (inp_value1 <-- o 1 aqui)

Você pode fazer isso, o que provavelmente é mais fácil de entender:
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; por que especificar name3/4/5/6 em sua saída esperada se eles são todos nulos? Se os dados nunca tiverem mais de 2 linhas por par empid/ele_name, basta escrever null as input_name3.. e assim por diante
  • pps:chamei minha tabela t2 - edite seu nome na consulta
  • pps; Não sei se a coluna "data de término" realmente tem um espaço no nome, chamei a minha com sublinhado

Ou você pode girar assim (mais difícil de entender, mas mais compacto):
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

mas as colunas sairão do pvt.* com nomes como 1_inp_name, 1_inp_value .. Você terá que usar AS para renomeá-los