sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man skapar pivottabell i PostgreSQL

Pivottabell är ett användbart sätt att analysera stora mängder data genom att organisera dem i ett mer hanterbart format. Så här skapar du en pivottabell i PostgreSQL. Med andra ord kommer vi att skapa korstabeller i PostgreSQL.

Hur man skapar en pivottabell i PostgreSQL

Det finns åtminstone ett par sätt att skapa pivottabeller i PostgreSQL. En är där vi pivoterar rader till kolumner i PostgreSQL med CASE-satsen, och en annan är ett enkelt exempel på PostgreSQL-korstabellfunktion.

Låt oss säga att du har följande tabell

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

Låt oss säga att du vill skapa pivottabell i PostgreSQL, så att en ny kolumn skapas för varje unikt värde i field_key kolumn, det vill säga (förnamn, efternamn, yrke) som visas nedan

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

Skapa pivottabell i PostgreSQL med CASE-satsen

Du kan enkelt överföra rader till kolumner i tabellen ovan med CASE-satsen,

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 uttalandet ovan, varje rads fältnyckel värdet kontrolleras och därför fylls kolumnerna i. Till exempel om fältnyckel värdet är 'first_name' sedan first_name kolumnen är ifylld och så vidare.

När du väl har skapat en pivottabell i PostgreSQL kan du använda ett rapportverktyg för att plotta den i en tabell. Här är ett exempel på en pivottabell skapad med Ubiq. Visste du att Ubiq låter dig skapa pivottabeller utan att skriva någon SQL?

Bonus läs: Hur man beräknar löpande totalsumma i rödförskjutning

Skapa pivottabell i PostgreSQL med hjälp av Crosstab-funktionen

PostgreSQL har också en inbyggd Crosstab-funktion som gör att du enkelt kan skapa pivottabeller i PostgreSQL. Du måste dock installera table_func tillägg för att aktivera korstabellfunktionen.

postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Låt oss säga att du har följande tabell.

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

Låt oss säga att du vill pivotera tabellen ovan genom Exam kolumn, så att du för varje elev får 1 rad, med alla provresultat som separata kolumner, som visas nedan.

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

Eftersom vi har aktiverat Crosstab-funktionen för vår databas kan du använda följande fråga för att skapa en korstabell 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 fungerar med en SELECT-fråga som indataparameter som måste följa tre krav

  • Den måste returnera tre kolumner
  • Den första kolumnen är radidentifieraren för din sista pivottabell, t.ex. namn
  • Den andra kolumnen är kategorikolumnen som ska pivoteras, t.ex. examen
  • Den tredje kolumnen är värdekolumnen som du vill pivotera, t.ex. poäng

Korstabellen tar resultatet av din SELECT-fråga och bygger en pivottabell av den, baserat på kolumnerna du nämner för din pivottabell. I ovanstående fråga lagras pivottabellen i en temporär tabell ct(namn varchar(15),exam1 int, exam2 int, exam3 int, exam4 int). Du måste definiera kolumnnamn och datatyper för din slutliga pivottabell.

Bonus läsning: Hur man beräknar glidande medelvärde i rödförskjutning

Enligt vår åsikt, om du vill skapa pivottabeller i PostgreSQL, fann vi att Crosstab-metoden var svårare än att använda CASE-satsen, främst för att Crosstab kastar fel om du inte definierar kolumndatatyper för den slutliga pivottabellen korrekt.

Ändå vet du nu två sätt att skapa pivottabeller i PostgreSQL. Du kan anpassa dem enligt dina önskemål.

Visste du att du kan skapa pivottabeller i Ubiq genom att bara dra och släppa?

Förresten, om du vill skapa pivottabeller, diagram och instrumentpaneler från PostgreSQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.

  1. Hur man skapar ett tillägg för SSMS 2019 (v18)

  2. Analysera I/O-prestanda för SQL Server

  3. Hur man lagrar anställdas scheman i en databas

  4. Vilken datatyp för latitud och longitud?