pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Josh Berkus <josh@agliodbs.com>
To: dev@archonet.com
To: pgsql-sql@postgresql.org
Subject: Re: Crosstab-style query in pure SQL
Date: Mon, 13 Jan 2003 09:26:13 -0800
Message-ID: <web-2312151@davinci.ethosmedia.com> (raw)
In-Reply-To: <1493.192.168.1.16.1042462021.squirrel@mainbox.archonet.com>

Richard,

> I have a table containing milestones achieved for projects, marked as
> being in particular quarters.
> 
> CREATE TABLE milestones (
>     proj_id     int4,
>     sortorder   SERIAL,
>     qtr         int4,
>     description varchar(200)
> );
> 
> Now I need the milestone descriptions output across the page like:
>   proj_id | q1 | q2 | q3 | q4
> and sorted according to "sortorder".

Ah!   A classic SQL problem.

Take a look at Joe Celko's "SQL for Smarties": he does a good job of
defining and discussing the three different solutions to the "Crosstab
Query" problem.

A second method you can use is the subselect method:

SELECT  proj_id, sortorder, qart1.q1, quart2.q2 ....
FROM milestones
LEFT OUTER JOIN ( SELECT proj_id, description as q1
           FROM milestones WHERE qtr = 1) quart1
         ON quart1.proj_id = milestones.proj_id
LEFT OUTER JOIN ( SELECT proj_id, description q2 ... 

However, the above is generally chosen over the CASE statement method
when the crosstab involves multiple tables; in your case, it is not a
performance or similicity gain.

There is a third method which involves building a grid of values:

ref	qtr1	qtr2	qtr3	qtr4
qtr1	1	0	0	0
qtr2	0	1	0	0
qtr3	0	0	1	0
qtr4	0	0	0	1

This method is the only one of the three that prevents you from having
to build your query using procedural logic for a dynamic set of
parameters.   However, the above is set up for numeric values (i.e. one
multiplies the grid number by the value to add into calculations) and
will not work for your varchar-returning query.

You could, however, constuct the grid with NULLs and '' strings and use
that to modify the value; I leave that to your ingenuity.

-Josh Berkus









view thread (3+ messages)  latest in thread

Message-ID: <web-2312151@davinci.ethosmedia.com>
Permalink:  ../web-2312151@davinci.ethosmedia.com/
Also on:    postgresql.org/message-id/web-2312151@davinci.ethosmedia.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: josh@agliodbs.com, dev@archonet.com
  Subject: Re: Crosstab-style query in pure SQL
  In-Reply-To: <web-2312151@davinci.ethosmedia.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