PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment créer un tableau croisé dynamique dans PostgreSQL

Le tableau croisé dynamique est un moyen utile d'analyser une grande quantité de données en les organisant dans un format plus gérable. Voici comment créer un tableau croisé dynamique dans PostgreSQL. En d'autres termes, nous allons créer un tableau croisé dans PostgreSQL.

Comment créer un tableau croisé dynamique dans PostgreSQL

Il existe au moins deux façons de créer un tableau croisé dynamique dans PostgreSQL. L'une consiste à faire pivoter des lignes vers des colonnes dans PostgreSQL à l'aide de l'instruction CASE, et une autre est un exemple simple de fonction de tableau croisé PostgreSQL.

Disons que vous avez le tableau suivant

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

Supposons que vous souhaitiez créer un tableau croisé dynamique dans PostgreSQL, de sorte qu'une nouvelle colonne soit créée pour chaque valeur unique dans field_key colonne, c'est-à-dire (first_name, last_name, occupation) comme indiqué ci-dessous

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

Créer un tableau croisé dynamique dans PostgreSQL à l'aide de l'instruction CASE

Vous pouvez facilement transposer des lignes en colonnes dans le tableau ci-dessus à l'aide de l'instruction 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   |
+------------+------------+-----------+------------+

Dans l'instruction ci-dessus, la field_key de chaque ligne la valeur est cochée et les colonnes sont remplies en conséquence. Par exemple, si field_key la valeur est 'first_name' puis first_name la colonne est remplie, et ainsi de suite.

Une fois que vous avez créé un tableau croisé dynamique dans PostgreSQL, vous pouvez utiliser un outil de création de rapports pour le tracer dans un tableau. Voici un exemple de tableau croisé dynamique créé avec Ubiq. Saviez-vous qu'Ubiq vous permet de créer des tableaux croisés dynamiques sans écrire de SQL ?

Lecture bonus : Comment calculer le total cumulé dans Redshift

Créer un tableau croisé dynamique dans PostgreSQL à l'aide de la fonction Crosstab

PostgreSQL fournit également une fonction de tableau croisé intégrée qui vous permet de créer facilement un tableau croisé dynamique dans PostgreSQL. Cependant, vous devez installer le table_func extension pour activer la fonction Crosstab.

postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Disons que vous avez le tableau suivant.

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

Supposons que vous souhaitiez faire pivoter le tableau ci-dessus par examen colonne, de sorte que pour chaque étudiant, vous obtenez 1 ligne, avec toutes les notes d'examen dans des colonnes séparées, comme indiqué ci-dessous.

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

Puisque nous avons activé la fonction Crosstab pour notre base de données, vous pouvez utiliser la requête suivante pour créer un tableau croisé dans 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

Le tableau croisé fonctionne avec une requête SELECT comme paramètre d'entrée qui doit respecter 3 exigences

  • Il doit renvoyer 3 colonnes
  • La première colonne est l'identifiant de la ligne de votre tableau croisé dynamique final, par exemple le nom
  • La 2e colonne est la colonne de catégorie à faire pivoter, par exemple examen
  • La 3ème colonne est la colonne de valeur que vous souhaitez faire pivoter, par exemple le score

Le tableau croisé prendra le résultat de votre requête SELECT et créera un tableau croisé dynamique à partir de celui-ci, en fonction des colonnes que vous mentionnez pour votre tableau croisé dynamique. Dans la requête ci-dessus, le tableau croisé dynamique est stocké dans une table temporaire ct(name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int). Vous devez définir les noms des colonnes et les types de données de votre tableau croisé dynamique final.

Lecture bonus : Comment calculer la moyenne mobile dans Redshift

À notre avis, si vous souhaitez créer un tableau croisé dynamique dans PostgreSQL, nous avons trouvé que la méthode Crosstab était plus difficile que d'utiliser l'instruction CASE, principalement parce que Crosstab génère des erreurs si vous ne définissez pas correctement les types de données de colonne du tableau croisé dynamique final.

Néanmoins, vous connaissez maintenant deux façons de créer un tableau croisé dynamique dans PostgreSQL. Vous pouvez les personnaliser selon vos besoins.

Saviez-vous que vous pouvez créer des tableaux croisés dynamiques dans Ubiq par simple glisser-déposer ?

Au fait, si vous souhaitez créer des tableaux croisés dynamiques, des graphiques et des tableaux de bord à partir de la base de données PostgreSQL, vous pouvez essayer Ubiq. Nous offrons un essai gratuit de 14 jours.