Font
[thread]3526[/thread]

post-processing fetchall_arrayref: DBI



<< |< 1 2 >| >> 16 entries, 2 pages
guest Gast
 2005-01-25 22:45
#32889 #32889
Ich habe eine Tabelle, aus der ich zwei Felder abfrage. Mit Fetchall_arrayref kann ich das gesamte Ergebnis auslesen, ich möchte aber zusätzlich die linke Spalte durchiterieren, um ggfs mit den Werten der rechten etwas zu machen (addieren). wie kann man das machen?
Code: (dl )
1
2
3
4
5
6
7
8
$sth=$dbh->prepare(qq{select id, quotient from ergebnis order by id});
$sth->execute();
my $array_ref=$sth->fetchall_arrayref();
foreach my $row (@$array_ref) {
#split the row
my ($id, $quotient) = @$row;
print "$id\t$quotient\n";
}
\n\n

<!--EDIT|renee|1106686560-->
renee
 2005-01-25 22:58
#32890 #32890
User since
2003-08-04
14367 articles
ModeratorIn
[Homepage] [default_avatar]
Ich verstehe nicht so ganz, was Du machen willst...

Wenn Du nur die Quotienten aufaddieren willst, dann mach doch einfach
Code: (dl )
1
2
3
4
5
6
7
8
9
10
$sth=$dbh->prepare(qq{select id, quotient from ergebnis order by id});
$sth->execute();
my $array_ref=$sth->fetchall_arrayref();
my $quot_sum = 0;
foreach my $row (@$array_ref) {
#split the row
my ($id, $quotient) = @$row;
$quot_sum += $quotient;
print "$id\t$quotient\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Micha
 2005-01-25 23:50
#32891 #32891
User since
2005-01-25
9 articles
BenutzerIn
[default_avatar]
Sorry für die Ungenauigkeit: Ich will die Quotienten nur in dem Fall aufaddieren, in dem die Ids identisch sind, d.h. diese müssen jeweils miteinander verglichen werden.
renee
 2005-01-26 09:39
#32892 #32892
User since
2003-08-04
14367 articles
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
$sth=$dbh->prepare(qq{select id, quotient from ergebnis order by id});
$sth->execute();
my $array_ref=$sth->fetchall_arrayref();
my %hash;
foreach my $row (@$array_ref) {
#split the row
my ($id, $quotient) = @$row;
$hash{$id} += $quotient;
print "$id\t$quotient\n";
}
\n\n

<!--EDIT|renee|1106725197-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2005-01-26 11:21
#32893 #32893
User since
2004-02-19
1749 articles
BenutzerIn

user image
du könntest auch mal schauen, ob folgendes SQL auf deiner DB funktioniert (die SUM Funktion sollte eigendlich bei jeder DB dabei sein):
Code: (dl )
SELECT id, SUM(quotient) FROM ergebniss GROUP BY id

imho ist es meist performanter solche grupierungen direkt in der datenbank zu machen, je nach datenbank kann da einiges optimiert werden.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Micha
 2005-01-26 15:33
#32894 #32894
User since
2005-01-25
9 articles
BenutzerIn
[default_avatar]
vielen dank für die Idee, ich hatte auch schon mal daran gedacht, aber bei MySQL scheint das nicht zu gehen; jedenfalls kommt bei dieser Formulierung eine Syntax-Fehlermeldung.
Micha
 2005-01-26 15:41
#32895 #32895
User since
2005-01-25
9 articles
BenutzerIn
[default_avatar]
Vielen dank renee erstmal, aber das verändert leider nichts. Ich versteh auch den Gedanken hinter $hash{$id} += $quotient ehrlich gesagt nicht ganz.
Dubu
 2005-01-26 15:59
#32896 #32896
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
Du hast hinterher im Hash %hash fuer jede $id einzeln die Summe der jeweiligen Quotienten, also genau das, was du wolltest. (Fuer so etwas sind Hashes ideal!) Das Ergebnis kannst du dir hinter der Schleife ansehen, z.B. mit
Code: (dl )
1
2
3
for (sort keys %hash) {
print "$_ => $hash{$_}\n";
}
renee
 2005-01-26 16:01
#32897 #32897
User since
2003-08-04
14367 articles
ModeratorIn
[Homepage] [default_avatar]
Weißt Du was Hashes sind??

Hashes sind Datenstrukturen, die aus Schlüssel - Wert bestehen... Ein Schlüssel ist eindeutig (wie der Primary Key einer Datenbank). Wenn man einen Schlüssel hat, kann man also eindeutig einen Wert bestimmen (der zum Schlüssel gehört).

In Perl sind Hashes durch das % gekennzeichnet (bei der Deklaration). Die Idee bei meinem Lösungsansatz (ist keine komplette Lösung) ist, dass ich zu dem Wert, der schon zu einem Schlüssel besteht, den Quotienten addiere... Bei dem Lösungsansatz musst Du natürlich noch den Hash ausgeben, um Deine Summen der Quotienten angezeigt zu bekommen.

Nehmen wir mal folgende Einträge an:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
ID    Quotient
1    4
2    3
2    5
3    7
3    3
4    9
4    2
4    1
4    7


Dann passiert folgendes...
1.) Der Schlüssel 1 existiert noch nicht, also wird zu 0 (perl nimmt an, dass die 0 gemeint ist) 4 addiert
2.) Der Schlüssel 2 existiert noch nicht, also wird zu 0 3 addiert
3.) Der Schlüssel 2 existiert schon, also wird zu dessen Wert (3) die 5 addiert --> neuer Wert = 8
4.) Der Schlüssel 3 existiert noch nicht, also wird zu 0 7 addiert
5.) Der Schlüssel 3 existiert schon, also wird zu dessen Wert (7) die 3 addiert --> neuer Wert = 10
6.) Der Schlüssel 4 existiert noch nicht, also wird zu 0 9 addiert
7.) Der Schlüssel 4 existiert schon, also wird zu dessen Wert (9) die 2 addiert --> neuer Wert =11
8.) Der Schlüssel 4 existiert schon, also wird zu dessen Wert (11) die 1 addiert --> neuer Wert = 12
9.) Der Schlüssel 4 existiert schon, also wird zu dessen Wert (12) die 7 addiert --> neuer Wert = 19

(mit use warnings gibt es allerdings eine Warnung [_kein_ Fehler] wenn der Schlüssel/Wert noch nicht existiert)

Wenn Du nach der for-Schleife noch das hier gemacht hättest:
Code: (dl )
1
2
3
foreach(sort(keys(%hash))){
 print "Id: ",$_," -> ",$hash{$id},"\n";
}
Dann hättest Du die aufsummierten Quotienten bekommen...

Um sich solch eine Datenstruktur anzuschauen, ist CPAN:Data::Dumper ganz nützlich...
Code: (dl )
1
2
use Data::Dumper;
print Dumper(\%hash);


Aber der Ansatz von Taulmarill ist eindeutig besser, da er weniger Programmierung verlangt, schneller ist...
Welche Fehlermeldung bekommst Du denn?\n\n

<!--EDIT|renee|1106748129-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Micha
 2005-01-26 16:51
#32898 #32898
User since
2005-01-25
9 articles
BenutzerIn
[default_avatar]
Sorry, für meine Ignoranz eben-war nicht bei der Sache. Eigentlich wußte ich, was Hashes sind, und fand die Idee unmittelbar darauf auch plausibel. Es funktioniert prima, danke Euch beiden!
<< |< 1 2 >| >> 16 entries, 2 pages



View all threads created 2005-01-25 22:45.