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

Jak utworzyć tabelę przestawną w PostgreSQL

Tabela przestawna to przydatny sposób analizowania dużej ilości danych poprzez organizowanie ich w łatwiejszy do zarządzania format. Oto jak utworzyć tabelę przestawną w PostgreSQL. Innymi słowy, stworzymy tabelę krzyżową w PostgreSQL.

Jak utworzyć tabelę przestawną w PostgreSQL

Istnieje co najmniej kilka sposobów tworzenia tabeli przestawnej w PostgreSQL. Jednym z nich jest przestawianie wierszy do kolumn w PostgreSQL za pomocą instrukcji CASE, a drugie to prosty przykład funkcji crosstab PostgreSQL.

Załóżmy, że masz poniższą tabelę

CREATE TABLE Meeting
(
    ID INT,
    Meeting_id INT,
    field_key VARCHAR(100),
    field_value VARCHAR(100)
);

INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (1, 1,'first_name' , 'Alec');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (2, 1,'last_name' , 'Jones');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (3, 1,'occupation' , 'engineer');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (4,2,'first_name' , 'John');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (5,2,'last_name' , 'Doe');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (6,2,'occupation' , 'engineer');

+------+------------+------------+-------------+
| ID   | Meeting_id | field_key  | field_value |
+------+------------+------------+-------------+
|    1 |          1 | first_name | Alec        |
|    2 |          1 | last_name  | Jones       |
|    3 |          1 | occupation | engineer    |
|    4 |          2 | first_name | John        |
|    5 |          2 | last_name  | Doe         |
|    6 |          2 | occupation | engineer    |
+------+------------+------------+-------------+

Załóżmy, że chcesz utworzyć tabelę przestawną w PostgreSQL, tak aby dla każdej unikalnej wartości w field_key tworzona była nowa kolumna kolumna, czyli (imię, nazwisko, zawód) jak pokazano poniżej

+------------+-------------+-------------+-------------+
| Meeting_id | first_name  |  last_name  |  occupation |
+------------+-------------+-------------+-------------+
|          1 |       Alec  | Jones       | engineer    |
|          2 |       John  | Doe         | engineer    |
+------------+-------------+-------------+-------------+

Utwórz tabelę przestawną w PostgreSQL za pomocą instrukcji CASE

Możesz łatwo transponować wiersze do kolumn w powyższej tabeli za pomocą instrukcji CASE,

postgresql> select meeting_Id,
         max(case when (field_key='first_name') then field_value else NULL end) as first_name,
         max(case when (field_key='last_name') then field_value else NULL end) as last_name,
         max(case when (field_key='occupation') then field_value else NULL end) as occupation
         from meeting
         group by meeting_Id
         order by meeting_Id;
+------------+------------+-----------+------------+
| meeting_Id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

W powyższym stwierdzeniu field_key each każdego wiersza wartość jest sprawdzana i odpowiednio wypełniane są kolumny. Na przykład, jeśli field_key wartość to ‘first_name’, a następnie first_name kolumna jest wypełniona i tak dalej.

Po utworzeniu tabeli przestawnej w PostgreSQL możesz użyć narzędzia do raportowania, aby wykreślić ją w tabeli. Oto przykład tabeli przestawnej utworzonej za pomocą Ubiq. Czy wiesz, że Ubiq umożliwia tworzenie tabel przestawnych bez pisania kodu SQL?

Przeczytaj bonus: Jak obliczyć sumę biegową z przesunięciem ku czerwieni

Utwórz tabelę przestawną w PostgreSQL za pomocą funkcji Crosstab

PostgreSQL zapewnia również wbudowaną funkcję Crosstab, która umożliwia łatwe tworzenie tabeli przestawnej w PostgreSQL. Musisz jednak zainstalować table_func rozszerzenie umożliwiające włączenie funkcji Crosstab.

postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Załóżmy, że masz poniższą tabelę.

CREATE TABLE exams (
id int(11) NOT NULL auto_increment,
name varchar(15),
exam int,
score int,
PRIMARY KEY (id)
);

insert into exams (name,exam,score) values ('Bob',1,70);
insert into exams (name,exam,score) values ('Bob',2,77);
insert into exams (name,exam,score) values ('Bob',3,71);
insert into exams (name,exam,score) values ('Bob',4,70);

insert into exams (name,exam,score) values ('Sue',1,89);
insert into exams (name,exam,score) values ('Sue',2,87);
insert into exams (name,exam,score) values ('Sue',3,88);
insert into exams (name,exam,score) values ('Sue',4,89);

mysql> select * from exams;
+------+------+------+-------+
| id   | name | exam | score |
+------+------+------+-------+
|   1  |  Bob |   1  |   70  |
|   2  |  Bob |   2  |   77  |
|   3  |  Bob |   3  |   71  |
|   4  |  Bob |   4  |   70  |
|   5  |  Sue |   1  |   89  |
|   6  |  Sue |   2  |   87  |
|   7  |  Sue |   3  |   88  |
|   8  |  Sue |   4  |   89  |
+------+------+------+-------+

Załóżmy, że chcesz przestawić powyższą tabelę według egzaminu kolumna, tak że dla każdego ucznia otrzymasz 1 wiersz, ze wszystkimi wynikami egzaminów w oddzielnych kolumnach, jak pokazano poniżej.

 name | exam1 | exam2 | exam3 | exam4
------+-------+-------+-------+-------
 Bob  |    70 |    77 |    71 |    70
 Sue  |    89 |    87 |    88 |    89

Ponieważ włączyliśmy funkcję tabeli krzyżowej dla naszej bazy danych, możesz użyć następującego zapytania, aby utworzyć tabelę krzyżową w PostgreSQL.

postgres=# SELECT * FROM crosstab('select name, exam, score from exams order by 1,2')
             AS ct (name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int);
 name | exam1 | exam2 | exam3 | exam4
------+-------+-------+-------+-------
 Bob  |    70 |    77 |    71 |    70
 Sue  |    89 |    87 |    88 |    89

Crosstab działa z zapytaniem SELECT jako parametrem wejściowym, który musi spełniać 3 wymagania

  • Musi zwrócić 3 kolumny
  • Pierwsza kolumna to identyfikator wiersza dla końcowej tabeli przestawnej, np. nazwa
  • Druga kolumna to kolumna kategorii, która ma być przestawiana, np. egzamin
  • Trzecia kolumna to kolumna wartości, którą chcesz przestawić, np. wynik

Tabela przestawna pobierze wynik zapytania SELECT i zbuduje z niego tabelę przestawną na podstawie kolumn wymienionych w tabeli przestawnej. W powyższym zapytaniu tabela przestawna jest przechowywana w tabeli tymczasowej ct(name varchar(15),exam1 int, egzamin2 int, egzamin3 int, egzamin4 int). Musisz zdefiniować nazwy kolumn i typy danych końcowej tabeli przestawnej.

Przeczytaj bonus: Jak obliczyć średnią kroczącą w przesunięciu ku czerwieni

Naszym zdaniem, jeśli chcesz utworzyć tabelę przestawną w PostgreSQL, okazało się, że metoda Crosstab jest trudniejsza niż użycie instrukcji CASE, głównie dlatego, że Crosstab generuje błędy, jeśli nie zdefiniujesz poprawnie typów danych kolumn końcowej tabeli przestawnej.

Niemniej jednak teraz znasz dwa sposoby tworzenia tabeli przestawnej w PostgreSQL. Możesz je dostosować zgodnie ze swoimi wymaganiami.

Czy wiesz, że możesz tworzyć tabele przestawne w Ubiq za pomocą przeciągania i upuszczania?

Przy okazji, jeśli chcesz tworzyć tabele przestawne, wykresy i dashboardy z bazy danych PostgreSQL, możesz wypróbować Ubiq. Oferujemy 14-dniowy bezpłatny okres próbny.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wygeneruj n wierszy NULL w PostgreSQL

  2. SQLalchemy nie zatwierdza zmian podczas ustawiania roli

  3. uWSGI, Flask, sqlalchemy i postgres:błąd SSL:odszyfrowanie nie powiodło się lub zły rekord mac

  4. Zniszczenie bazy danych Postgres na Heroku

  5. Przechowywanie strefy czasowej w znaczniku czasu typu danych ze strefą czasową