PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erstellen Sie eine Pivot-Tabelle in PostgreSQL

Pivot-Tabellen sind eine nützliche Methode, um große Datenmengen zu analysieren, indem sie in einem besser verwaltbaren Format organisiert werden. So erstellen Sie eine Pivot-Tabelle in PostgreSQL. Mit anderen Worten, wir erstellen eine Kreuztabelle in PostgreSQL.

So erstellen Sie eine Pivot-Tabelle in PostgreSQL

Es gibt mindestens ein paar Möglichkeiten, eine Pivot-Tabelle in PostgreSQL zu erstellen. Zum einen schwenken wir Zeilen in PostgreSQL mithilfe der CASE-Anweisung in Spalten, und ein anderes ist ein einfaches Beispiel für die PostgreSQL-Kreuztabellenfunktion.

Angenommen, Sie haben die folgende Tabelle

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

Angenommen, Sie möchten eine Pivot-Tabelle in PostgreSQL erstellen, sodass für jeden eindeutigen Wert in field_key eine neue Spalte erstellt wird Spalte, also (Vorname, Nachname, Beruf) wie unten gezeigt

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

Pivot-Tabelle in PostgreSQL mit CASE-Anweisung erstellen

Sie können Zeilen in der obigen Tabelle einfach mit der CASE-Anweisung

in Spalten transponieren
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   |
+------------+------------+-----------+------------+

In der obigen Anweisung der field_key jeder Zeile value überprüft und die Spalten entsprechend gefüllt. Wenn beispielsweise field_key Der Wert ist „Vorname“, dann Vorname Spalte ausgefüllt wird usw.

Sobald Sie eine Pivot-Tabelle in PostgreSQL erstellt haben, können Sie sie mit einem Berichterstellungstool in einer Tabelle darstellen. Hier ist ein Beispiel für eine mit Ubiq erstellte Pivot-Tabelle. Wussten Sie, dass Sie mit Ubiq Pivot-Tabellen erstellen können, ohne SQL schreiben zu müssen?

Bonuslektüre: So berechnen Sie die laufende Summe in Redshift

Erstellen Sie eine Pivot-Tabelle in PostgreSQL mit der Crosstab-Funktion

PostgreSQL bietet auch eine integrierte Crosstab-Funktion, mit der Sie auf einfache Weise eine Pivot-Tabelle in PostgreSQL erstellen können. Allerdings müssen Sie die table_func installieren Erweiterung, um die Kreuztabellenfunktion zu aktivieren.

postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Angenommen, Sie haben die folgende Tabelle.

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

Angenommen, Sie möchten die obige Tabelle nach Prüfung pivotieren Spalte, sodass Sie für jeden Schüler eine Zeile mit allen Prüfungsergebnissen als separate Spalten erhalten, wie unten gezeigt.

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

Da wir die Kreuztabellenfunktion für unsere Datenbank aktiviert haben, können Sie die folgende Abfrage verwenden, um eine Kreuztabelle in PostgreSQL zu erstellen.

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 arbeitet mit einer SELECT-Abfrage als Eingabeparameter, die drei Anforderungen erfüllen muss

  • Es müssen 3 Spalten zurückgegeben werden
  • Die erste Spalte ist die Zeilenkennung für Ihre endgültige Pivot-Tabelle, z. B. Name
  • Die 2. Spalte ist die zu pivotierende Kategoriespalte, z. B. Prüfung
  • Die 3. Spalte ist die Wertspalte, die Sie drehen möchten, z. B. die Punktzahl

Die Kreuztabelle nimmt das Ergebnis Ihrer SELECT-Abfrage und erstellt daraus eine Pivot-Tabelle, basierend auf den Spalten, die Sie für Ihre Pivot-Tabelle angeben. In der obigen Abfrage wird die Pivot-Tabelle in einer temporären Tabelle ct(name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int) gespeichert. Sie müssen die Spaltennamen und Datentypen Ihrer endgültigen Pivot-Tabelle definieren.

Bonuslektüre: So berechnen Sie den gleitenden Durchschnitt in Redshift

Wenn Sie eine Pivot-Tabelle in PostgreSQL erstellen möchten, fanden wir unserer Meinung nach die Crosstab-Methode schwieriger als die Verwendung der CASE-Anweisung, hauptsächlich weil Crosstab Fehler auslöst, wenn Sie die Spaltendatentypen der endgültigen Pivot-Tabelle nicht korrekt definieren.

Trotzdem kennen Sie jetzt zwei Möglichkeiten, um Pivot-Tabellen in PostgreSQL zu erstellen. Sie können sie gemäß Ihren Anforderungen anpassen.

Wussten Sie, dass Sie Pivot-Tabellen in Ubiq einfach per Drag &Drop erstellen können?

Übrigens, wenn Sie Pivot-Tabellen, Diagramme und Dashboards aus der PostgreSQL-Datenbank erstellen möchten, können Sie Ubiq ausprobieren. Wir bieten eine 14-tägige kostenlose Testversion an.