Re: Converting Rows to Columns - Mailing list pgsql-general

From Andreas Kretschmer
Subject Re: Converting Rows to Columns
Date
Msg-id 20090505150459.GA5616@tux
Whole thread Raw
In response to Converting Rows to Columns  (Joshua Berry <yoberi@gmail.com>)
List pgsql-general
Joshua Berry <yoberi@gmail.com> wrote:

> Greetings all,
>
> I know that this is an elementary question, so I'm just asking for a pointer in
> the right direction.
>
> I have a query like this that tries to link Retail shops (from the table
> aliased as 'a') to sales reps (from the table aliased as 'e') that service the
> given Retail shop:
>
> select a.id_pdv, e.apellido ||', ' || e.nombre as seller_name from tbl_pdvs a
> join tbl_circuitos b using (id_circuito) join tbl_frecuencias c on
> b.id_circuito = c.id_circuito join tbl_rutas d on c.id_ruta = d.id_ruta join
> tbl_vendedores e on d.vendedor = e.id_vendedor order by a.id_pdv limit 4;
>
>
>  id_pdv  |   seller_name
> ---------+-------------------
>  1000001 | COLON, CRISTOBOL
>  1000001 | LOPEZ, CARLOS
>  1000002 | COLON, CRISTOBOL
>  1000002 | LUGO, FERNANDO
>
>
> As you can see, there are two salesmen that service this shop.
>
> What I need is to be able to create a report that has each unique id_pdv as a
> row of the result set, with three columns available to show up to three salemen
> that are assigned to the route.
>
> So this would give something like this:
>
>  id_pdv  |  seller_name1    | seller_name2   | seller_name3
> ---------+------------------+----------------+----------------
>  1000001 | COLON, CRISTOBOL | LOPEZ, CARLOS  | (\N or '')
>  1000002 | COLON, CRISTOBOL | LUGO, FERNANDO | (\N or '')

Not really your desired result, but i think, a solution:

test=# select * from joshua ;
 id | name
----+-------
  1 | user1
  1 | user2
  1 | user3
  2 | user4
  2 | user5
  3 | user6
(6 rows)

Time: 0.138 ms
test=*# CREATE AGGREGATE array_accum (anyelement)
test-# (
test(#     sfunc = array_append,
test(#     stype = anyarray,
test(#     initcond = '{}'
test(# );
CREATE AGGREGATE
Time: 0.503 ms
test=*# select id, array_accum(name) from joshua group by id order by
id;
 id |     array_accum
----+---------------------
  1 | {user1,user2,user3}
  2 | {user4,user5}
  3 | {user6}
(3 rows)

Time: 0.369 ms
test=*#





Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect.                              (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly."   (unknown)
Kaufbach, Saxony, Germany, Europe.              N 51.05082°, E 13.56889°

pgsql-general by date:

Previous
From: Andreas Kretschmer
Date:
Subject: Re: Converting Rows to Columns
Next
From: "Markus Wollny"
Date:
Subject: PL/Perl: Is there a way to use spi_prepare/spi_exec_prepared with a list as second argument?