sql >> Databáze >  >> RDS >> Oracle

Více hodnot řádků do jednoho řádku

Než budete moci takto pivotovat, musíte udělat ještě nějakou práci, protože pivotování bere data řádků a převádí je na názvy sloupců, ale žádné z vašich dat na řádcích není 1, 2, 3, 4... použít jako název sloupce (inp_value1 <-- zde 1)

Můžete to udělat, což je pravděpodobně srozumitelnější:

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; proč zadávat name3/4/5/6 ve vašem očekávaném výstupu, pokud jsou allnull? Pokud data nikdy nebudou mít více než 2 řádky na pár empid/ele_name, pak stačí napsat null as input_name3.. a tak dále
  • pps:Zavolal jsem svou tabulku t2 – upravte své jméno do dotazu
  • ppps; Nevím, jestli má sloupec "datum ukončení" opravdu mezeru v názvu, ten svůj jsem nazval podtržítkem

Nebo se můžete otočit takto (hůře pochopitelné, ale kompaktnější):

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 sloupce vyjdou z pvt.* s názvy jako 1_inp_name, 1_inp_value .. Budete muset použít AS přejmenovat je




  1. Nelze vytvořit tabulku s readyStatement

  2. Oracle PL/SQL:Nápověda k vyřešení PLS-00103:Setkal se se symbolem LOOP při očekávání jedné z následujících situací:pokud

  3. Jak používat řetězcovou proměnnou v příkazu SQL

  4. Mysql adaptér pro Zend_Translate