Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wiele wierszy wartości w jednym wierszu

Musisz wykonać trochę więcej pracy, zanim będziesz mógł przestawiać w ten sposób, ponieważ przestawianie pobiera dane wierszy i przekształca je w nazwy kolumn, ale żadne z danych wierszy nie są 1, 2, 3, 4... do użycia jako nazwa kolumny (inp_value1 <-- 1 tutaj)

Możesz to zrobić, co prawdopodobnie jest łatwiejsze do zrozumienia:

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; po co określać name3/4/5/6 w oczekiwanych danych wyjściowych, jeśli są one wszystkie null? Jeśli dane nigdy nie będą miały więcej niż 2 wierszy na parę empid/ele_name, możesz po prostu napisać null as input_name3.. i tak dalej
  • pps:nazwałem mój stół t2 - edytuj swoje imię w zapytaniu
  • pps; Nie wiem, czy kolumna „data końcowa” rzeczywiście ma spację w nazwie, ja nazwałem swoją z podkreśleniem

Lub możesz przestawić w ten sposób (trudniejszy do zrozumienia, ale bardziej kompaktowy):

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

ale kolumny wyjdą z pvt.* z nazwami jako 1_inp_name, 1_inp_value .. Będziesz musiał użyć AS zmienić ich nazwy




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Statyczny vs dynamiczny sql

  2. instrukcja sqlplus z wiersza poleceń

  3. Problem z uruchomieniem skryptu oracle z wiersza poleceń za pomocą sqlplus

  4. Domyślna wartość EF6 Oracle dla kolumny w pierwszej migracji kodu

  5. Oracle JDBC:Skąd wiedzieć, który wiersz rzuca unikalne ograniczenie klucza?