You have not said whether the other number is in the database or elsewhere in your code.
I assume not in the DB, or you'd just multiply the values in the columns: $sum += ($record->{total} * $record->{price});.
If from another source, and you need to look it up, say from a price sheet based on quantity ordered, make yourself a lookup table:
use strict;
use warnings;
use feature 'state', 'say';
use Test::More;
use JSON;
sub calc_rev {
state %price_by_qty = (
1 => 15,
3 => 10,
6 => 8,
10 => 5,
);
my $qty = shift;
return 0 if ! $qty;
for my $level ( sort { $b <=> $a } keys %price_by_qty ) {
return $qty * $price_by_qty{ $level } if $qty >= $level;
}
}
#
# mock getting an aref of rows for this test file
my $json = do { local $/; <DATA> };
my $rows = decode_json( $json );
#
my $revenue = 0;
for my $row ( @{ $rows } ) {
$revenue += calc_rev($row->{total});
}
is( $revenue, 123, 'Revenue is 123. Mwahahahaa!');
done_testing;
__DATA__
[
{"total":3},
{"total":6},
{"total":1},
{"total":2}
]
Output:
$ perl foo.pl
ok 1 - Revenue is 123. Mwahahahaa!
1..1
Hope this helps!
The way forward always starts with a minimal test.
|