Re: origins/destinations - Mailing list pgsql-general

From Andy Colson
Subject Re: origins/destinations
Date
Msg-id 4A1317FB.6090700@squeakycode.net
Whole thread Raw
In response to Re: origins/destinations  (Andy Colson <andy@squeakycode.net>)
Responses Re: origins/destinations  (Carson Farmer <carson.farmer@gmail.com>)
List pgsql-general
Andy Colson wrote:
> Carson Farmer wrote:
>> Hi list,
>>
>> I have (what I thought was) a relatively simple problem, but my
>> knowledge of sql is just not good enough to get this done:
>>
>> I have a table which is basically a number of individuals with both
>> their origin and destination as columns (see Table 1). In this case,
>> origins and destinations are the census area in which they and work.
>> What I would like to do is generate an nxn matrix (preferably output
>> to csv but I'll take what I can get), where origins are on the y axis,
>> and destinations on the x axis (see Table 3).
>>
> <snip>
>
> Would it have to be sql only?  I think this would be pretty easy in perl.
>
> -Andy

I took the liberty of assuming the origins and destinations could have
different values

Something like this:

#!/usr/bin/perl -w
use strict;
use DBI;

my $sql = 'select origin, dest, count(*) from tmp group by origin, dest';
my $db =  DBI->connect('dbi:Pg:dbname=andy', 'andy', '') or die;

my $orlist = $db->selectcol_arrayref('select distinct origin from tmp
order by origin');
my $dstlist = $db->selectcol_arrayref('select distinct dest from tmp
order by dest');

my %table;
my $q = $db->prepare($sql);
$q->execute();
while (my($origin, $dest, $cc) = $q->fetchrow_array)
{
    $table{$origin}->{$dest} += $cc;
}

print "origins\t";
foreach my $dst (@$dstlist)
{
    print "$dst\t";
}
print "\n";

foreach my $ori (@$orlist)
{
    print "$ori\t";

    foreach my $dst (@$dstlist)
    {
        my $v = $table{$ori}->{$dst};
        if (! $v) {
            $v = '0';
        }
        print "$v\t";
    }
    print "\n";
}



pgsql-general by date:

Previous
From: Andy Colson
Date:
Subject: Re: origins/destinations
Next
From: Andy Colson
Date:
Subject: Re: Help with join syntax sought