Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Nhiều giá trị hàng thành một hàng

Bạn cần thực hiện thêm một số công việc trước khi có thể xoay vòng như vậy, vì xoay vòng lấy dữ liệu hàng và biến nó thành tên cột, nhưng không có dữ liệu hàng nào của bạn là 1, 2, 3, 4... để sử dụng làm tên cột (inp_value1 <- the 1 here)

Bạn có thể làm điều này, điều này có lẽ dễ hiểu hơn:

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; tại sao chỉ định name3 / 4/5/6 trong đầu ra mong đợi của bạn nếu chúng toàn bộ? Nếu dữ liệu không bao giờ có nhiều hơn 2 hàng cho mỗi cặp empid / ele_name thì bạn chỉ có thể viết null as input_name3.. vân vân và vân vân
  • pps:tôi đã gọi bảng của mình là t2 - hãy chỉnh sửa tên của bạn vào truy vấn
  • ppps; Tôi không biết cột "ngày kết thúc" có thực sự có khoảng trắng trong tên hay không, tôi đã gọi là cột của mình bằng dấu gạch dưới

Hoặc bạn có thể xoay như thế này (khó hiểu hơn nhưng gọn hơn):

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

nhưng các cột sẽ thoát ra khỏi pvt.* với các tên như 1_inp_name, 1_inp_value .. Bạn sẽ phải sử dụng AS để đổi tên chúng




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails3 không thể lưu 'ñ' vào Oracle 11g

  2. khi chèn ký tự Persian trong oracle db, tôi thấy dấu chấm hỏi

  3. Chỉ mục không được sử dụng do chuyển đổi loại?

  4. Sử dụng gv $ session để biết một truy vấn có bị treo hay không

  5. Oracle tương đương với chức năng STUFF của SQL Server?