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

Tabela przestawna z wartościami niekardynalnymi

Rozwiązanie, które nie wymaga wielu samopołączeń:

Możesz PIVOT w wyniku ROW_NUMBER() funkcja analityczna, aby uzyskać żądany wynik:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY test ORDER BY ROWNUM ) AS rn
  FROM   your_table t
)
PIVOT ( MAX( Reader ) AS reader, MAX( result ) AS result FOR rn IN ( 1, 2, 3 ) );

Wyjście :

TEST 1_READER 1_RESULT 2_READER 2_RESULT 3_READER 3_RESULT
---- -------- -------- -------- -------- -------- --------
   1 John          1.6 Jack          5.2
   2 Ursula        2.5 Jack          5.1
   3 Albert        3.0

Lub po prostu używając funkcji agregacji:

SELECT test,
       MAX( CASE rn WHEN 1 THEN reader END ) AS reader_1,
       MAX( CASE rn WHEN 1 THEN result END ) AS result_1,
       MAX( CASE rn WHEN 2 THEN reader END ) AS reader_2,
       MAX( CASE rn WHEN 2 THEN result END ) AS result_2,
       MAX( CASE rn WHEN 3 THEN reader END ) AS reader_3,
       MAX( CASE rn WHEN 3 THEN result END ) AS result_3
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY test ORDER BY ROWNUM ) AS rn
  FROM   your_table t
)
GROUP BY test;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyjaśnienie operatora Oracle UNION

  2. Funkcja przechowywana w wywołaniu C# Oracle

  3. Jak uzyskać skrypt tabeli w Oracle SQL Developer?

  4. Oracle DB:Jak mogę napisać zapytanie, ignorując wielkość liter?

  5. Jakikolwiek wpływ na wydajność w Oracle przy użyciu LIKE „ciąg” vs =„ciąg”?