PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres — transpozycja wierszy do kolumn

Użyj crosstab() z modułu tablefunc.

SELECT * FROM crosstab(
   $$SELECT user_id, user_name, rn, email_address
     FROM  (
        SELECT u.user_id, u.user_name, e.email_address
             , row_number() OVER (PARTITION BY u.user_id
                            ORDER BY e.creation_date DESC NULLS LAST) AS rn
        FROM   usr u
        LEFT   JOIN email_tbl e USING (user_id)
        ) sub
     WHERE  rn < 4
     ORDER  BY user_id
   $$
  , 'VALUES (1),(2),(3)'
   ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);

Użyłem cudzysłowu w dolarach dla pierwszego parametru, który nie ma specjalnego znaczenia. Po prostu wygodnie jest zmienić pojedyncze cudzysłowy w ciągu zapytania, co jest częstym przypadkiem:

  • Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL

Szczegółowe wyjaśnienie i instrukcje:

  • Kwerendy PostgreSQL Crosstab

A w szczególności w przypadku „dodatkowych kolumn”:

  • Przestaw na wiele kolumn za pomocą funkcji Tablefunc

specjalne trudności oto:

  • Brak nazw kluczy.
    --> Zastępujemy row_number() w podzapytaniu.

  • Różna liczba e-maili.
    --> Ograniczamy się do max. z trzech w zewnętrznym SELECT
    i użyj crosstab() z dwoma parametrami, dostarczając listę możliwych kluczy.

Zwróć uwagę na NULLS LAST w ORDER BY .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zabij sesję/połączenie postgresql

  2. Radzenie sobie z powolnymi zapytaniami w PostgreSQL

  3. Jak odczytać zawartość pliku .sql do skryptu R, aby uruchomić zapytanie?

  4. Postgres Error:Więcej niż jeden wiersz zwrócony przez podzapytanie użyte jako wyrażenie

  5. Pobierz nazwę właściciela bazy danych w PostgreSql