Пивотната таблица е полезен начин за анализиране на голямо количество данни, като ги организирате в по-управляем формат. Ето как да създадете централна таблица в PostgreSQL. С други думи, ще създадем кръстосана таблица в PostgreSQL.
Как да създадете обобщена таблица в PostgreSQL
Има поне няколко начина за създаване на централна таблица в PostgreSQL. Единият е мястото, където ние завъртаме редове към колони в PostgreSQL с помощта на оператор CASE, а друг е прост пример за функцията за кръстосана таблица на PostgreSQL.
Да приемем, че имате следната таблица
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 | +------+------------+------------+-------------+
Да приемем, че искате да създадете централна таблица в PostgreSQL, така че да се създаде нова колона за всяка уникална стойност в field_key колона, това е (първо_име, фамилия, професия) както е показано по-долу
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Създайте обобщена таблица в PostgreSQL с помощта на оператор CASE
Можете лесно да транспонирате редове в колони в горната таблица, като използвате израза 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 | +------------+------------+-----------+------------+
В горния израз field_key на всеки ред стойността се проверява и съответно колоните се попълват. Например, ако field_key стойността е „first_name“, след което first_name колоната се попълва и т.н.
След като създадете въртяща се таблица в PostgreSQL, можете да използвате инструмент за отчитане, за да я начертаете в таблица. Ето пример за централна таблица, създадена с помощта на Ubiq. Знаете ли, че Ubiq ви позволява да създавате централни таблици, без да пишете SQL?
Бонус за четене: Как да изчислим общия брой текущи в Redshift
Създайте обобщена таблица в PostgreSQL с помощта на функцията Crosstab
PostgreSQL също така предоставя вградена функция Crosstab, която ви позволява лесно да създавате въртяща таблица в PostgreSQL. Трябва обаче да инсталирате table_func разширение, за да активирате функцията Crosstab.
postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;
Да приемем, че имате следната таблица.
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 | +------+------+------+-------+
Да приемем, че искате да завъртите горната таблица чрез Изпит колона, така че за всеки студент да получите 1 ред, с всички резултати от изпитите като отделни колони, както е показано по-долу.
name | exam1 | exam2 | exam3 | exam4 ------+-------+-------+-------+------- Bob | 70 | 77 | 71 | 70 Sue | 89 | 87 | 88 | 89
Тъй като сме активирали функцията Crosstab за нашата база данни, можете да използвате следната заявка, за да създадете кръстосана таблица в 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 работи със заявка SELECT като входен параметър, който трябва да отговаря на 3 изисквания
- Трябва да върне 3 колони
- Първата колона е идентификаторът на реда за вашата крайна обобщена таблица, напр. име
- Втората колона е колоната за категория, която трябва да се завърти, напр. изпит
- Третата колона е колоната със стойности, която искате да завъртите, например резултат
Кръстосаната таблица ще вземе резултата от вашата SELECT заявка и ще изгради централна таблица от нея въз основа на колоните, които споменавате за вашата обобщена таблица. В горната заявка осевата таблица се съхранява във временна таблица ct(name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int). Трябва да дефинирате имената на колоните и типовете данни на вашата крайна обобщена таблица.
Бонус за четене: Как да изчислим пълзящата средна в червено изместване
Според нас, ако искате да създадете въртяща се таблица в PostgreSQL, открихме, че методът Crosstab е по-труден от използването на оператор CASE, главно защото Crosstab хвърля грешки, ако не дефинирате правилно типовете данни на колоните на крайната обобщена таблица.
Въпреки това, сега знаете два начина за създаване на централна таблица в PostgreSQL. Можете да ги персонализирате според вашите изисквания.
Знаете ли, че можете да създавате централни таблици в Ubiq, като използвате просто плъзгане и пускане?
Между другото, ако искате да създадете централни таблици, диаграми и табла за управление от базата данни PostgreSQL, можете да опитате Ubiq. Предлагаме 14-дневен безплатен пробен период.