pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Joe Conway <mail@joeconway.com>
To: Elizabeth O'Neill's Office Mail <elizabeth.oneill@abcmail.co.uk>
Cc: pgsql-sql@postgresql.org
Subject: Re: SQL syntax for concating values in different rows together
Date: Tue, 10 Dec 2002 10:31:41 -0800
Message-ID: <3DF6330D.1090900@joeconway.com> (raw)
In-Reply-To: <BA1B8E36.1C25%elizabeth.oneill@abcmail.co.uk>
References: <BA1B8E36.1C25%elizabeth.oneill@abcmail.co.uk>

Elizabeth O'Neill's Office Mail wrote:
> I have two tables in my database a complaint table and a resolution table.
> One complaint may have several resolutions. I am trying to build a report
> that will give me the complaint details and all the resolution descriptions
> for a complaint in one text area/row (concated together).
> 
> At the moment it is repeating the complaint details for each resolution.

As someone else mentioned I think, you can use a plpgsql function. Here is a 
contrived example:

create table complaint(cid int, descr text);
insert into complaint values(1,'my #1 complaint');
insert into complaint values(2,'my #2 complaint');
create table resolution(rid int, cid int, res text);
insert into resolution values (1,1,'fixed it');
insert into resolution values (2,1,'really fixed it!');
insert into resolution values (3,2,'pbkbac again');

create or replace function my_concat(int) returns text as'
declare
   ret text;
   comp text;
   rec record;
   cntr int = 0;
begin
   select into comp descr from complaint where cid = $1;
   ret := ''Comp = '' || comp;
   for rec in select res from resolution where cid = $1 loop
     cntr := cntr + 1;
     ret := ret || '': Res# '' || cntr::text || '' = '' || rec.res;
   end loop;
   return ret;
end;
' language 'plpgsql';

regression=# select my_concat(cid) from complaint;
                               my_concat
----------------------------------------------------------------------
  Comp = my #1 complaint: Res# 1 = fixed it: Res# 2 = really fixed it!
  Comp = my #2 complaint: Res# 1 = pbkbac again
(2 rows)

In the past I think I remember someone trying to solve this kind of problem 
with a custom aggregate, but the plpgsql approach is probably simpler.

HTH,

Joe




view thread (3+ messages)

Message-ID: <3DF6330D.1090900@joeconway.com>
Permalink:  ../3DF6330D.1090900@joeconway.com/
Also on:    postgresql.org/message-id/3DF6330D.1090900@joeconway.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: mail@joeconway.com, elizabeth.oneill@abcmail.co.uk
  Subject: Re: SQL syntax for concating values in different rows together
  In-Reply-To: <3DF6330D.1090900@joeconway.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox