Oracle
 sql >> база данни >  >> RDS >> Oracle

Стойности на няколко реда в един ред

Трябва да свършите още малко работа, преди да можете да завъртите по този начин, защото завъртането отнема данни от редове и ги превръща в имена на колони, но нито един от вашите данни за редове не е 1, 2, 3, 4... за използване като име на колона (inp_value1 <-- 1 тук)

Можете да направите това, което вероятно е по-лесно за разбиране:

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; защо да посочвате name3/4/5/6 в очаквания изход, ако те са allnull? Ако данните никога няма да имат повече от 2 реда на двойка empid/ele_name, тогава можете просто да напишете null as input_name3.. и така нататък
  • pps:извиках таблицата си t2 - редактирайте името си в заявката
  • ppps; Не знам дали колоната „крайна дата“ наистина има интервал в името, нарекох моята с долна черта

Или можете да завъртите по този начин (по-трудно за разбиране, но по-компактно):

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

но колоните ще излязат от pvt.* с имена като 1_inp_name, 1_inp_value .. Ще трябва да използвате AS за да ги преименувате




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да декларирам числова променлива, където мога да запазя броя на таблицата в моя цикъл

  2. Едноредови функции в Oracle sql

  3. Дайте промяна само на една колона в таблицата

  4. Как да потвърдите датата ГГГГММДД, дадена като параметър PL/SQL

  5. Състезание между избор и актуализация