Re: Convert data into horizontal from vertical form

From: Adarsh Sharma <adarsh(dot)sharma(at)orkash(dot)com>
To: Emanuel Calvo <postgres(dot)arg(at)gmail(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Convert data into horizontal from vertical form
Date: 2011-05-20 11:58:32
Message-ID: 4DD65768.8020601@orkash.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Emanuel Calvo wrote:
> 2011/5/19 Adarsh Sharma <adarsh(dot)sharma(at)orkash(dot)com>:
>
>> Dear all,
>>
>> I am not able to insert data into a table in horizontal form.
>>
>> The data is in below form :
>>
>> A show a small set of data :-
>>
>> c_id f_name f_value
>> 2 k1 v1
>> 2 k2 v2
>> 2 k3 v3
>> 2 k4 v4
>> 3 a1 b1
>> 3 a2 b2
>> 3 a3 b3
>> 3 a4 b4
>> 3 a5 b5
>> 1 c1 d1
>> 1 c2 d2
>> 3 a1 e1
>> 3 a2 e2
>> 3 a3 e3
>> 3 a4 e4
>> 3 a5 e5
>>
>> Now i want to show the above data in horizontal form as per c_id , fore.g if
>> a user enters c_id 3 then output is :
>>
>> c_id a1 a2 a3 a4 a5
>> 3 b1 b2 b3 b4 b5
>> 3 e1 e2 e3 e4
>> e5
>>
>> i.e f_name entries became the columns of the table & f_value become the rows
>>
>>
>> I research on crosstab function but i don'e think it is useful because we
>> have to give column names in the command.
>> I want to show it dynamically . I try to create a procedure & also attach
>> it.
>>
>> A user enters only c_id & output is shown fore.g if a user enters c_id 1
>> then output is
>>
>> c_id c1 c2
>> 1 d1 d2
>>
>> I show the data in simple way bt there r 10000 of rows & 100 of c_id's.
>>
>>
>> Please let me know if it is possible or any information is required.
>>
>>
>
>
> Something like this?
>
> http://wiki.postgresql.org/wiki/Pivot_query
>
I am able to understand the 2nd procedure as but have some conflicts
with it :

CREATE OR REPLACE FUNCTION pivoty(query text) RETURNS void AS $pivot$
DECLARE
num_cols int;
num_rows int;
table_pivoted text;
columna text;
BEGIN
DROP TABLE IF EXISTS pivoted;
DROP TABLE IF EXISTS pivot_;

EXECUTE 'CREATE TEMP TABLE pivot_ AS ' || query ;

SELECT count(*) INTO num_cols FROM information_schema.COLUMNS WHERE table_name = 'pivot_';
SELECT count(*) INTO num_rows FROM pivot_;

table_pivoted := 'CREATE TABLE pivoted (';
FOR i IN 1 .. num_rows
LOOP

IF ( i = num_rows )
THEN
SELECT table_pivoted || 'col' || i || ' text ' INTO table_pivoted;
ELSE
SELECT table_pivoted || 'col' || i || ' text ,' INTO table_pivoted;
END IF;
END LOOP;

SELECT table_pivoted || ')' INTO table_pivoted;

EXECUTE table_pivoted;

/******The above if-else condition will create the columns (col1,col2,col3....and so on ) depending upon the rows of original table but I want the column names depend upon f_name column and category_id input by user*/

/* It may be 10,12,11,15 columns**/

FOR columna IN SELECT column_name::Text FROM information_schema.COLUMNS WHERE table_name = 'pivot_'
LOOP
EXECUTE 'INSERT INTO pivoted SELECT ((translate(array_agg(' || columna || ')::text,''{}'',''()'' ))::pivoted).* FROM pivot_';

END LOOP;

/*****How to call the procedure * pivoty(query text)
/****and how it insert data in new table*******/

*END;
$pivot$ LANGUAGE plpgsql;

> Thanks
>
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message salah jubeh 2011-05-20 13:22:38 Views permessions
Previous Message Emanuel Calvo 2011-05-20 11:10:34 Re: Convert data into horizontal from vertical form