Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Beberapa nilai baris menjadi satu baris

Anda perlu melakukan beberapa pekerjaan lagi sebelum dapat melakukan pivot seperti itu, karena pivot mengambil data baris dan membuatnya menjadi nama kolom, tetapi tidak ada data baris Anda yang 1, 2, 3, 4... untuk digunakan sebagai nama kolom (inp_value1 <-- 1 di sini)

Anda dapat melakukan ini, yang mungkin lebih mudah dipahami:

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; mengapa tentukan name3/4/5/6 di output yang Anda harapkan jika semuanya nol? Jika data tidak akan pernah memiliki lebih dari 2 baris per pasangan empid/ele_name maka Anda cukup menulis null as input_name3.. dan seterusnya
  • pps:saya memanggil tabel saya t2 - edit nama Anda ke dalam kueri
  • pps; Saya tidak tahu apakah kolom "tanggal akhir" benar-benar memiliki spasi pada namanya, saya memanggil milik saya dengan garis bawah

Atau Anda dapat memutar seperti ini (lebih sulit dipahami tetapi lebih ringkas):

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

tapi kolom akan keluar dari pvt.* dengan nama sebagai 1_inp_name, 1_inp_value .. Anda harus menggunakan AS untuk mengganti namanya




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ODP.NET Oracle.ManagedDataAcess acak kesalahan ORA-12570

  2. Perbedaan antara kelas driver Oracle jdbc?

  3. XAException di Server Aplikasi Websphere

  4. LISTAGG berbeda yang ada di dalam subquery dalam daftar SELECT

  5. Buffer string karakter kesalahan terlalu kecil di Oracle Stored Procedure