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

Come creare una tabella pivot in PostgreSQL

La tabella pivot è un modo utile per analizzare grandi quantità di dati organizzandoli in un formato più gestibile. Ecco come creare una tabella pivot in PostgreSQL. In altre parole, creeremo campi incrociati in PostgreSQL.

Come creare una tabella pivot in PostgreSQL

Ci sono almeno un paio di modi per creare una tabella pivot in PostgreSQL. Uno è dove spostiamo le righe in colonne in PostgreSQL usando l'istruzione CASE, e un altro è un semplice esempio di funzione di campi incrociati di PostgreSQL.

Supponiamo che tu abbia la seguente tabella

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

Supponiamo che tu voglia creare una tabella pivot in PostgreSQL, in modo tale che venga creata una nuova colonna per ogni valore univoco in field_key colonna, ovvero (nome, cognome, occupazione) come mostrato di seguito

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

Crea tabella pivot in PostgreSQL utilizzando l'istruzione CASE

Puoi facilmente trasporre le righe in colonne nella tabella sopra usando l'istruzione 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   |
+------------+------------+-----------+------------+

Nell'istruzione precedente, la chiave_campo di ogni riga valore viene verificato e di conseguenza le colonne vengono popolate. Ad esempio, se field_key il valore è 'first_name' quindi first_name la colonna è popolata e così via.

Dopo aver creato una tabella pivot in PostgreSQL, puoi utilizzare uno strumento di reporting per tracciarla in una tabella. Ecco un esempio di tabella pivot creata utilizzando Ubiq. Sapevi che Ubiq ti consente di creare tabelle pivot senza scrivere SQL?

Bonus letto: Come calcolare il totale parziale in Redshift

Crea tabella pivot in PostgreSQL utilizzando la funzione Crosstab

PostgreSQL fornisce anche una funzione Crosstab integrata che consente di creare facilmente tabelle pivot in PostgreSQL. Tuttavia, devi installare table_func estensione per abilitare la funzione Crosstab.

postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Supponiamo che tu abbia la seguente tabella.

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

Supponiamo che tu voglia trasformare la tabella sopra per Esame colonna, in modo tale che per ogni studente si ottiene 1 riga, con tutti i punteggi degli esami come colonne separate, come mostrato di seguito.

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

Poiché abbiamo abilitato la funzione Crosstab per il nostro database, puoi utilizzare la seguente query per creare un crosstab in 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

Il campo incrociato funziona con una query SELECT come parametro di input che deve seguire 3 requisiti

  • Deve restituire 3 colonne
  • La prima colonna è l'identificatore di riga per la tabella pivot finale, ad esempio il nome
  • La 2a colonna è la colonna della categoria su cui eseguire il pivot, ad es. esame
  • La 3a colonna è la colonna del valore su cui vuoi fare il pivot, ad esempio il punteggio

Il campo incrociato prenderà il risultato della tua query SELECT e ne costruirà una tabella pivot, in base alle colonne che hai menzionato per la tua tabella pivot. Nella query precedente, la tabella pivot è archiviata in una tabella temporanea ct(name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int). Devi definire i nomi delle colonne e i tipi di dati della tua tabella pivot finale.

Bonus letto: Come calcolare la media mobile in Redshift

A nostro avviso, se si desidera creare una tabella pivot in PostgreSQL, abbiamo riscontrato che il metodo Crosstab è più difficile rispetto all'utilizzo dell'istruzione CASE, principalmente perché Crosstab genera errori se non si definiscono correttamente i tipi di dati delle colonne della tabella pivot finale.

Tuttavia, ora conosci due modi per creare una tabella pivot in PostgreSQL. Puoi personalizzarli secondo le tue esigenze.

Sapevi che puoi creare tabelle pivot in Ubiq semplicemente trascinando e rilasciando?

A proposito, se vuoi creare tabelle pivot, grafici e dashboard dal database PostgreSQL, puoi provare Ubiq. Offriamo una prova gratuita di 14 giorni.