2016-10-27 3 views
0

Моя таблица выглядит следующим образом (с 250 стран, перечисленных в разделе «id_country» и 50 лет под «год»):Как кросс-таблицы таблицы с множеством записей в Postgres?

id_country year value 
     4  2000  5 
     4  2001  6 
     4  2002  4 
     4  2003  8 
     8  2000  7 
     8  2001  6 
     8  2002  9 
     8  2003  3 
     12  2000  6 
     12  2001  4 
     12  2002  7 
     12  2003  5 

И я хотел бы, чтобы преобразовать это с помощью запроса в этот

  4 8 12 16 ... 
    2000 5 7  
    2001 6 
    2003 4 
    2004 8 
    ... 

Я сделал что-то подобное с PHP через петли, но это было немного странно. Интересно, есть ли более прямой и плавный, Postgres-SQL-способ сделать это. Возможно, это невозможно без функции Postgres? К сожалению, я не являюсь таким экспертом.

+1

Таблицы сопряженности сложны по своей природе в SQL, так как это не так, как SQL работает. Число столбцов запроса должно быть известно ** перед **, запрос выполняется. Таким образом, лучший способ сделать кросс-таблицы - это уровень приложения. –

ответ

0

вы можете использовать функцию кросс-таблицы, как показано ниже;

CREATE TABLE "test1" 
(
    id_country integer NOT NULL, 
    year text NOT NULL, 
    value integer 
) 

INSERT INTO test1 (id_country,year,value) VALUES (4,'2000', 5); 
INSERT INTO test1 (id_country,year,value) VALUES (4,'2001', 6); 
INSERT INTO test1 (id_country,year,value) VALUES (4,'2002', 4); 
INSERT INTO test1 (id_country,year,value) VALUES (4,'2003', 8); 
INSERT INTO test1 (id_country,year,value) VALUES (8,'2000', 7); 
INSERT INTO test1 (id_country,year,value) VALUES (8,'2001', 6); 
INSERT INTO test1 (id_country,year,value) VALUES (8,'2002', 9); 
INSERT INTO test1 (id_country,year,value) VALUES (8,'2003', 3); 
INSERT INTO test1 (id_country,year,value) VALUES (12,'2000', 6); 
INSERT INTO test1 (id_country,year,value) VALUES (12,'2001', 4); 
INSERT INTO test1 (id_country,year,value) VALUES (12,'2002', 7); 
INSERT INTO test1 (id_country,year,value) VALUES (12,'2003', 5); 


SELECT * 
FROM crosstab(
    'select year, id_country, value 
    from test1 
    order by 1,2') 
AS ct(year text, "4" int, "8" int, "12" int); 

, если вы получаете сообщение об ошибке: function crosstab (unknown), вы должны запустить это;

CREATE EXTENSION tablefunc; 

enter image description here