Re: origins/destinations
От | Andy Colson |
---|---|
Тема | Re: origins/destinations |
Дата | |
Msg-id | 4A1317FB.6090700@squeakycode.net обсуждение исходный текст |
Ответ на | Re: origins/destinations (Andy Colson <andy@squeakycode.net>) |
Ответы |
Re: origins/destinations
|
Список | 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 по дате отправления: