PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como criar uma tabela dinâmica no PostgreSQL


A tabela dinâmica é uma maneira útil de analisar grandes quantidades de dados organizando-os em um formato mais gerenciável. Veja como criar uma tabela dinâmica no PostgreSQL. Em outras palavras, vamos criar crosstab no PostgreSQL.


Como criar tabela dinâmica no PostgreSQL


Existem pelo menos algumas maneiras de criar uma tabela dinâmica no PostgreSQL. Um é onde nós dinamizamos linhas para colunas no PostgreSQL usando a instrução CASE, e outro é um exemplo simples de função de tabela cruzada do PostgreSQL.

Digamos que você tenha a seguinte tabela
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    |
+------+------------+------------+-------------+

Digamos que você queira criar uma tabela dinâmica no PostgreSQL, de modo que uma nova coluna seja criada para cada valor exclusivo em field_key coluna, que é (first_name, last_name, ocupação) como mostrado abaixo
+------------+-------------+-------------+-------------+
| Meeting_id | first_name  |  last_name  |  occupation |
+------------+-------------+-------------+-------------+
|          1 |       Alec  | Jones       | engineer    |
|          2 |       John  | Doe         | engineer    |
+------------+-------------+-------------+-------------+


Criar tabela dinâmica no PostgreSQL usando a instrução CASE


Você pode facilmente transpor linhas em colunas na tabela acima usando a instrução 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   |
+------------+------------+-----------+------------+

Na instrução acima, a field_key de cada linha valor é verificado e, consequentemente, as colunas são preenchidas. Por exemplo, se field_key o valor é 'first_name' então first_name coluna é preenchida, e assim por diante.

Depois de criar uma tabela dinâmica no PostgreSQL, você pode usar uma ferramenta de relatório para plotá-la em uma tabela. Aqui está um exemplo de tabela dinâmica criada usando Ubiq. Você sabia que o Ubiq permite criar tabelas dinâmicas sem escrever SQL?





Leitura bônus: Como calcular o total em execução no Redshift


Criar tabela dinâmica no PostgreSQL usando a função Crosstab


O PostgreSQL também fornece uma função Crosstab integrada que permite criar facilmente uma tabela dinâmica no PostgreSQL. No entanto, você precisa instalar o table_func extensão para habilitar a função Crosstab.
postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Digamos que você tenha a seguinte tabela.
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  |
+------+------+------+-------+

Digamos que você queira dinamizar a tabela acima por Exame coluna, de modo que para cada aluno você obtenha 1 linha, com todas as pontuações dos exames como colunas separadas, conforme mostrado abaixo.
 name | exam1 | exam2 | exam3 | exam4
------+-------+-------+-------+-------
 Bob  |    70 |    77 |    71 |    70
 Sue  |    89 |    87 |    88 |    89



Como habilitamos a função Crosstab para nosso banco de dados, você pode usar a seguinte consulta para criar uma crosstab no 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 funciona com uma consulta SELECT como parâmetro de entrada que deve seguir 3 requisitos
  • Deve retornar 3 colunas
  • A primeira coluna é o identificador de linha para sua tabela dinâmica final, por exemplo, nome
  • A 2ª ​​coluna é a coluna de categoria a ser dinamizada, por exemplo, exame
  • A terceira coluna é a coluna de valor que você deseja dinamizar, por exemplo, pontuação

O Crosstab pegará o resultado de sua consulta SELECT e construirá uma tabela dinâmica com base nas colunas que você menciona para sua tabela dinâmica. Na consulta acima, a tabela dinâmica é armazenada em uma tabela temporária ct(name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int). Você precisa definir os nomes das colunas e os tipos de dados da sua tabela dinâmica final.



Leitura bônus: Como calcular a média móvel no Redshift



Em nossa opinião, se você deseja criar uma tabela dinâmica no PostgreSQL, descobrimos que o método Crosstab é mais difícil do que usar a instrução CASE, principalmente porque o Crosstab gera erros se você não definir os tipos de dados da coluna da tabela dinâmica final corretamente.

No entanto, agora você conhece duas maneiras de criar uma tabela dinâmica no PostgreSQL. Você pode personalizá-los conforme sua necessidade.

Você sabia que pode criar tabelas dinâmicas no Ubiq usando apenas arrastar e soltar?

A propósito, se você deseja criar tabelas dinâmicas, gráficos e painéis do banco de dados PostgreSQL, experimente o Ubiq. Oferecemos um teste gratuito de 14 dias.