sql >> Databáze >  >> RDS >> PostgreSQL

Jak vytvořit kontingenční tabulku v PostgreSQL

Kontingenční tabulka je užitečný způsob, jak analyzovat velké množství dat jejich uspořádáním do lépe spravovatelného formátu. Zde je návod, jak vytvořit kontingenční tabulku v PostgreSQL. Jinými slovy, vytvoříme křížovou tabulku v PostgreSQL.

Jak vytvořit kontingenční tabulku v PostgreSQL

Existuje alespoň několik způsobů, jak vytvořit kontingenční tabulku v PostgreSQL. Jedním je místo, kde v PostgreSQL pivotujeme řádky do sloupců pomocí příkazu CASE, a dalším je jednoduchý příklad křížové funkce PostgreSQL.

Řekněme, že máte následující tabulku

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

Řekněme, že chcete vytvořit kontingenční tabulku v PostgreSQL, takže pro každou jedinečnou hodnotu v key_key se vytvoří nový sloupec. sloupec, tedy (jméno, příjmení, povolání) jak je uvedeno níže

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

Vytvoření kontingenční tabulky v PostgreSQL pomocí příkazu CASE

Řádky ve výše uvedené tabulce můžete snadno transponovat do sloupců pomocí příkazu 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   |
+------------+------------+-----------+------------+

Ve výše uvedeném příkazu je klíč_pole každého řádku zkontroluje se hodnota a podle toho se vyplní sloupce. Pokud například klíč_pole hodnota je ‘first_name’ a poté first_name sloupec je vyplněn a tak dále.

Jakmile v PostgreSQL vytvoříte kontingenční tabulku, můžete ji pomocí nástroje pro vytváření sestav vykreslit do tabulky. Zde je příklad kontingenční tabulky vytvořené pomocí Ubiq. Věděli jste, že Ubiq umožňuje vytvářet kontingenční tabulky bez psaní SQL?

Bonusové čtení: Jak vypočítat průběžný součet v Redshift

Vytvoření kontingenční tabulky v PostgreSQL pomocí funkce Crosstab

PostgreSQL také poskytuje vestavěnou funkci Crosstab, která vám umožní snadno vytvořit kontingenční tabulku v PostgreSQL. Musíte však nainstalovat table_func rozšíření pro aktivaci funkce Crosstab.

postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;

Řekněme, že máte následující tabulku.

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

Řekněme, že chcete posunout výše uvedenou tabulku podle zkoušky sloupec, takže pro každého studenta získáte 1 řádek se všemi výsledky zkoušek v samostatných sloupcích, jak je uvedeno níže.

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

Protože jsme pro naši databázi povolili funkci Crosstab, můžete k vytvoření křížové tabulky v PostgreSQL použít následující dotaz.

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 pracuje s dotazem SELECT jako vstupním parametrem, který musí splňovat 3 požadavky

  • Musí vrátit 3 sloupce
  • První sloupec je identifikátor řádku pro vaši konečnou kontingenční tabulku, např. název
  • Druhý sloupec je sloupec kategorie, který má být otočen, např. zkouška
  • Třetí sloupec je sloupec hodnot, který chcete seřadit, např. skóre

Křížová tabulka převezme výsledek vašeho dotazu SELECT a sestaví z něj kontingenční tabulku na základě sloupců, které u kontingenční tabulky zmiňujete. Ve výše uvedeném dotazu je kontingenční tabulka uložena v dočasné tabulce ct(name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int). Musíte definovat názvy sloupců a datové typy vaší konečné kontingenční tabulky.

Bonusové čtení: Jak vypočítat klouzavý průměr v Redshift

Podle našeho názoru, pokud chcete vytvořit kontingenční tabulku v PostgreSQL, zjistili jsme, že metoda Crosstab je obtížnější než použití příkazu CASE, hlavně proto, že Crosstab hází chyby, pokud správně nedefinujete datové typy sloupců konečné kontingenční tabulky.

Nyní však znáte dva způsoby, jak vytvořit kontingenční tabulku v PostgreSQL. Můžete si je přizpůsobit podle svých požadavků.

Věděli jste, že v Ubiq můžete vytvářet kontingenční tabulky pouhým přetažením?

Mimochodem, pokud chcete vytvářet kontingenční tabulky, grafy a dashboardy z databáze PostgreSQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.

  1. Připojte se k databázi PostgreSQL na kontejneru Docker

  2. Přidat den k časovému razítku

  3. Automatizujte nasazení vašeho MySQL nebo Postgres Cluster ze zálohy

  4. Konsolidace instance SQL Server pomocí shlukování a stohování