Как перевернуть таблицу

Необходимо перевернуть таблицу
________________________________________________
Column1 | Date | Column2 |
_______|_______|________|
aaaaaa |1/01/10 |123 |
--------------------------------------
bbbbbb |2/01/10 |234 |
--------------------------------------
aaaaaa |3/01/10 |453 |
--------------------------------------

После выполнения запроса таблица должна принять вид

Column1 | 1/01/10 | 2/01/10 | 3/01/10 |
_______|_______|________|_______ |
aaaaaa | 123 | | 453 |
---------------------------------------------------
bbbbbb | |234 | |
---------------------------------------------------

Количество колонок с датой заранее не известно

Желательно написать скрипт

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Например DBI и Perl вам в

Например DBI и Perl вам в руки для написания скрипта. Примеры работы с DBI здесь:
http://postgresql.ru.net/docs/pgsql_dbi_perl.html

можно и так

можно и так попробовать

CREATE TABLE t (id integer,
                dt date,
                n integer);
 
INSERT INTO t VALUES (1,'2007-03-15',1);
INSERT INTO t VALUES (1,'2010-03-15',2);
INSERT INTO t VALUES (2,'2008-03-15',3);
INSERT INTO t VALUES (3,'2009-03-15',4);
INSERT INTO t VALUES (4,'2010-03-15',5);
 
CREATE OR REPLACE FUNCTION ct() returns void
AS $$
  declare vdt date;
          vdts date[]; 
          vid integer;
          vn integer;
          i integer=1;
          vSQL text;
 begin
  DROP TABLE IF EXISTS t1;
 
  vSQL='create temp table t1 (id integer, ';
 
  FOR vdt IN
          SELECT DISTINCT t.dt FROM t ORDER BY 1 loop
  vdts[i]=vdt;
  i=i+1;
  vSQL=vSQL||quote_ident(to_char(vdt, 'YYYY-MM-DD'))||' integer,';        
  end loop;        
  vSQL=substring(vSQL FROM 1 FOR length(vSQL)-1)||');';
 
  begin
  execute vSQL;
  end;
 
   i=1;
   FOR i IN 1..array_upper(vdts,1) loop
    FOR vid, vn IN 
                SELECT DISTINCT t.id, t.n FROM t WHERE t.dt=vdts[i] ORDER BY 1 loop
    IF EXISTS (SELECT '*' FROM t1 WHERE t1.id=vid) then
    vSQL='update t1 set '||
            quote_ident(to_char(vdts[i], 'YYYY-MM-DD'))||
            '='||
            vn||
            'where id='||
            vid||';';
     else 
     vSQL='insert into t1 (id, '||
          quote_ident(to_char(vdts[i], 'YYYY-MM-DD'))||
          ') values ('||
          vid||
          ','||
          vn||');';
     end IF;
 
     begin
      Execute vSQL;
     end;     
 
     end loop;
    end loop;
 end;
$$ LANGUAGE plpgsql;
 
SELECT * FROM ct(); SELECT * FROM t1 ORDER BY 1;

Спасибо, пришел к тому, что

Спасибо, пришел к тому, что написал скрипт на PHP и с помощью массивов на стороне уже PHP преобразовал в нужный мне вид.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023