sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan opretter du pivottabel i PostgreSQL

Pivottabel er en nyttig måde at analysere store mængder data ved at organisere dem i et mere overskueligt format. Sådan opretter du pivottabel i PostgreSQL. Med andre ord vil vi oprette krydstabeller i PostgreSQL.

Sådan opretter du pivottabel i PostgreSQL

Der er mindst et par måder at oprette pivottabel i PostgreSQL. Den ene er, hvor vi pivoterer rækker til kolonner i PostgreSQL ved hjælp af CASE-sætning, og en anden er et simpelt eksempel på PostgreSQL krydstabulatorfunktion.

Lad os sige, at du har følgende 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    |
+------+------------+------------+-------------+

Lad os sige, at du vil oprette pivottabel i PostgreSQL, således at der oprettes en ny kolonne for hver unik værdi i field_key kolonne, det vil sige (fornavn, efternavn, stilling) som vist nedenfor

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

Opret pivottabel i PostgreSQL ved hjælp af CASE-sætning

Du kan nemt transponere rækker til kolonner i ovenstående tabel ved hjælp af CASE-sætning,

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   |
+------------+------------+-----------+------------+

I ovenstående sætning er hver rækkes feltnøgle værdien kontrolleres, og kolonnerne udfyldes derfor. For eksempel, hvis feltnøgle værdien er 'fornavn' og derefter fornavn kolonne er udfyldt, og så videre.

Når du har oprettet pivottabel i PostgreSQL, kan du bruge et rapporteringsværktøj til at plotte den i en tabel. Her er et eksempel på pivottabel oprettet ved hjælp af Ubiq. Vidste du, at Ubiq giver dig mulighed for at oprette pivottabeller uden at skrive SQL?

Bonus læst: Sådan beregner du løbende total i rødforskydning

Opret pivottabel i PostgreSQL ved hjælp af krydstabulatorfunktionen

PostgreSQL har også en indbygget Crosstab-funktion, der giver dig mulighed for nemt at oprette pivottabel i PostgreSQL. Du skal dog installere table_func udvidelse for at aktivere krydstabuleringsfunktionen.

postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Lad os sige, at du har følgende 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  |
+------+------+------+-------+

Lad os sige, at du vil pivotere ovenstående tabel ved eksamen kolonne, sådan at du for hver elev får 1 række, med alle eksamensresultater som separate kolonner, som vist nedenfor.

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

Da vi har aktiveret krydstabulatorfunktion for vores database, kan du bruge følgende forespørgsel til at oprette en krydstabulator i 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 arbejder med en SELECT-forespørgsel som inputparameter, der skal følge 3 krav

  • Den skal returnere 3 kolonner
  • Den første kolonne er række-id'et for din sidste pivottabel, f.eks. navn
  • Den anden kolonne er kategorikolonnen, der skal pivoteres, f.eks. eksamen
  • Den tredje kolonne er den værdikolonne, som du vil dreje, f.eks. score

Krydstabulatoren tager resultatet af din SELECT-forespørgsel og bygger pivottabel ud af den, baseret på de kolonner, du nævner for din pivottabel. I ovenstående forespørgsel er pivottabellen gemt i en midlertidig tabel ct(navn varchar(15),exam1 int, exam2 int, exam3 int, exam4 int). Du skal definere kolonnenavnene og datatyperne for din endelige pivottabel.

Læs bonus: Sådan beregner du glidende gennemsnit i rødforskydning

Efter vores mening, hvis du vil oprette pivottabel i PostgreSQL, fandt vi, at Crosstab-metoden var sværere end at bruge CASE-sætning, primært fordi Crosstab kaster fejl, hvis du ikke definerer kolonnedatatyper for den endelige pivottabel korrekt.

Ikke desto mindre kender du nu to måder at oprette pivottabel i PostgreSQL. Du kan tilpasse dem efter dit behov.

Vidste du, at du kan oprette pivottabeller i Ubiq ved blot at trække og slippe?

Forresten, hvis du vil oprette pivottabeller, diagrammer og dashboards fra PostgreSQL-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.

  1. Indstilling af netværkstimeout for JDBC-forbindelse

  2. Hvordan RTRIM_ORACLE() virker i MariaDB

  3. Hvordan installeres localdb separat?

  4. Hvordan transaction_timestamp() virker i PostgreSQL