From: | Chansup Byun <Chansup(dot)Byun(at)Sun(dot)COM> |
---|---|
To: | "Obe, Regina DND\\MIS" <robe(dot)dnd(at)cityofboston(dot)gov> |
Cc: | pgsql-novice(at)postgresql(dot)org |
Subject: | Re: looking for some suggestions |
Date: | 2006-05-08 13:20:44 |
Message-ID: | 445F45AC.6050806@sun.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-novice |
Obe, Regina DND\MIS wrote:
> I think the most efficient way to do this is with an aggregate function.
>
> You can define an aggregate for a varchar and text if one doesn't exist
> in your database - like so
>
> CREATE AGGREGATE sum(
> BASETYPE=text,
> SFUNC=textcat,
> STYPE=text
> );
> ALTER AGGREGATE sum(text) OWNER TO postgres;
>
> Then you can rewrite your sql statement like so
>
> SELECT p.fname As parent, sum(c.fname || ' ') AS "Children"
> FROM persons p LEFT JOIN dependents d ON p.person_id = d.parent_id LEFT
> JOIN c.persons c ON d.child_id = c.person_id
> GROUP BY p.fname
>
I followed your suggestion and was able to aggregate child names.
boc=# SELECT p.fname As parent, sum(c.fname || ' ') AS "Children"
boc-# FROM persons p
boc-# LEFT JOIN dependents d ON p.person_id = d.parent_id
boc-# LEFT JOIN persons c ON d.child_id = c.person_id
boc-# GROUP BY p.fname;
parent | Children
------------+--------------------
Momi Three |
Dadj Four |
Kidc One |
Dadh Three |
Mome Two | Kidf Two Kidg Two
Momb One | Kidc One
Dadd Two | Kidf Two Kidg Two
Dada One | Kidc One
Kidg Two |
Kidf Two |
Now my next question is how to make sure kids are ordered by ages?
Suppose that I extend the persons table and add birth_date filed, how
can I order child names by age? Is there a way to put such a check in to
the aggregate sum(text) function?
create table persons
(
person_id serial ,
fname varchar(32) ,
birth_date date ,
CONSTRAINT person_pk PRIMARY KEY(person_id)
);
Thanks,
- Chansup
>
>
>
> -----Original Message-----
> From: pgsql-novice-owner(at)postgresql(dot)org
> [mailto:pgsql-novice-owner(at)postgresql(dot)org] On Behalf Of Chansup Byun
> Sent: Friday, May 05, 2006 3:22 PM
> To: pgsql-novice(at)postgresql(dot)org
> Cc: Chansup(dot)Byun(at)Sun(dot)COM
> Subject: [NOVICE] looking for some suggestions
>
>
> Hi,
>
> I am looking for some suggestions on my test example.
>
> I have two tables: one for persons and the other for dependents table,
> which is shown below. I would like to concatenate all children of the
> same parents in a single string such as:
>
> Children
> -----------------
> Kidc One
> Kidf Two, Kidg Two
>
> Can anyone help me how to do that from the following tables?
>
> I have installed PostgreSQL 8.1.3.
>
> The tables and their records are given below.
>
> create table persons
> (
> person_id serial ,
> fname varchar(32) ,
> CONSTRAINT person_pk PRIMARY KEY(person_id)
> );
>
> create table dependents
> (
> parent_id integer not null,
> child_id integer not null,
> CONSTRAINT dependents_pk PRIMARY KEY(parent_id, child_id)
> );
>
>
> insert into persons(fname) values('Dada One');
> insert into persons(fname) values('Momb One');
> insert into persons(fname) values('Kidc One');
>
> insert into persons(fname) values('Dadd Two');
> insert into persons(fname) values('Mome Two');
> insert into persons(fname) values('Kidf Two');
> insert into persons(fname) values('Kidg Two');
>
> insert into persons(fname) values('Dadh Three');
> insert into persons(fname) values('Momi Three');
>
> insert into persons(fname) values('Dadj Four');
>
> insert into dependents(parent_id, child_id) values('1', '3'); insert
> into dependents(parent_id, child_id) values('2', '3'); insert into
> dependents(parent_id, child_id) values('4', '6'); insert into
> dependents(parent_id, child_id) values('5', '6'); insert into
> dependents(parent_id, child_id) values('4', '7'); insert into
> dependents(parent_id, child_id) values('5', '7');
>
> The following attempt can list all the children but I'm not sure how to
> group them into a single string based on their parents.
>
> SELECT DISTINCT c.fname AS "Children"
> FROM persons p, persons c, dependents d
> WHERE d.parent_id = p.person_id AND
> d.child_id = c.person_id
> ;
>
> Children
> ----------
> Kidc One
> Kidf Two
> Kidg Two
>
>
> Thanks,
>
> - Chansup
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: Don't 'kill -9' the postmaster
>
> -----------------------------------------
> The substance of this message, including any attachments, may be
> confidential, legally
> privileged and/or exempt from disclosure pursuant to Massachusetts
> law. It is intended
> solely for the addressee. If you received this in error, please
> contact the sender and
> delete the material from any computer.
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: explain analyze is your friend
From | Date | Subject | |
---|---|---|---|
Next Message | zvirid traian | 2006-05-08 13:35:21 | UNSUBSCRIBE |
Previous Message | Sean Davis | 2006-05-08 10:40:11 | Re: Backup Schema w/ SQL Text File |