sql >> Databasteknik >  >> RDS >> Oracle

Flera radvärden i en enda rad

Du måste göra lite mer arbete innan du kan pivotera så, eftersom pivotering tar raddata och gör det till kolumnnamn, men ingen av dina raddata är 1, 2, 3, 4... att använda som kolumnnamn (inp_value1 <-- 1 här)

Du kan göra detta, vilket förmodligen är lättare att förstå:

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; varför ange namn3/4/5/6 i din förväntade utdata om de är helt null? Om data aldrig kommer att ha fler än 2 rader per empid/ele_name-par kan du bara skriva null as input_name3.. och så vidare
  • pps:jag ringde min tabell t2 - redigera ditt namn i frågan
  • ppps; Jag vet inte om kolumnen "slutdatum" verkligen har ett mellanslag i namnet, jag kallade min med ett understreck

Eller så kan du pivotera så här (svårare att förstå men mer kompakt):

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

men kolumnerna kommer ut från pvt.* med namn som 1_inp_name, 1_inp_value .. Du måste använda AS för att byta namn på dem




  1. Avancerad MySql-fråga:Uppdatera tabell med information från en annan tabell

  2. Hur man får gårdagens datum i PostgreSQL

  3. Hur man hanterar stora mysql-frågor

  4. T-SQL lagrad procedur för att returnera google stil föreslagna sökresultat