0

次のようにSQLで作成された「トランザクション」テーブルがあります。

TranID  Date        AccNum   Type    Amount ChequeNo DDNo  
657520  02-07-1999  0181432  Debit   16000  465774     
657524  02-07-1999  0181432  Debit   13000           569086
657538  09-07-1999  0181432  Credit  11000  
657548  18-07-1999  0181432  Credit  15500  
657519  02-07-1999  0181432  Debit   12000  
657523  02-07-1999  0181432  Credit  11000  
657529  03-07-1999  0181433  Debit   15000  466777
657539  10-07-1999  0181433  Credit  10000  
657541  11-07-1999  0181433  Debit   12000  
657525  03-07-1999  0181433  Debit   15000           569999
657533  05-07-1999  0181433  Credit  12500  

問題は次のとおりです。トランザクションテーブルからデータをクエリし、小切手、dd、および各アカウントの現金から引き落とされる合計金額を計算し、結果をスプレッドシートに保存します。私のスクリプトは次のようなものです。

#!/usr/bin/perl
use strict;
use warnings;
use DBI; 
use Spreadsheet::WriteExcel;
my $dbh = DBI->connect('dbi:mysql:database:3306','prithvi','prithvi') or die $dbh->errstr;
my $sth = $dbh->prepare("SELECT `AccNum`,`Type`,`Amount`,`ChequeNo`,`DDNo` FROM `transaction`");
$sth->execute or die $sth->errstr;
my $workbook = Spreadsheet::WriteExcel->new('query_result.xls');
my $worksheet = $workbook->add_worksheet();
my $row = 0;
my $col = 0;
my %h;
$worksheet->write_row($row++,$col,['Account Number','Cheque Debit','DD Debit','Cash Debit']);
while(my @data = $sth->fetchrow_array)
{
 next unless($data[1] eq 'Debit');
 my $result = $data[3] ? "ChequeNo" : $data[4] ? "DDNo" : "Cash";
 $h{$data[0]}{$result} += $data[2];
 $worksheet->write_row($row++,$col,\@data);
}
$sth->finish;
$dbh->disconnect;

適切な出力が得られません。どこが間違っているのですか?助けてください。前もって感謝します。この質問に対する答えはありません。つまり、主に結果をスプレッドシートに保存します。答える前にこれを閉じないでください。皆様からのご要望をお待ちしております。

4

2 に答える 2

2
   SELECT
    t1.AccountNumber, 
    SUM(t1.Amount)-(SELECT SUM(t2.Amount) from transaction t2 
     where t2.Type = 'Credit' 
     AND t2.AccountNumber = t1.AccountNumber) AS Subtraction
    from transaction t1
    WHERE t1.Type = 'Debit'
    group by t1.AccountNumber

結果:

ACCOUNTNUMBER   SUBTRACTION
016901581432    2500
016901581433    6000
016901581434    14500

SQLFIDDLEの例を編集しました。

于 2012-10-05T07:57:48.307 に答える
1

データベースに接続してSQLクエリを作成する方法をうまく理解しているようです。次に、結果をスプレッドシートに取り込む必要があります。

Excelスプレッドシートが必要な場合は、Spreadsheet::WriteExcelモジュールを確認することをお勧めします。私は過去にこれを使用しましたが、良い結果が得られました。使用方法の簡単な例を次に示します。

use DBI;
use strict;
use warnings;
use Spreadsheet::WriteExcel;

#
#Query the database here...
#


my $workbook = Spreadsheet::WriteExcel->new('query_results.xls');
my $worksheet = $workbook->add_worksheet();

my $row = 0;
my $col = 0;

#Write the column labels.
$worksheet->write_row($row++, $col, 
    ['Account Number','Type','Total Debit Amount']
);

while( my @data = $tran_cur->fetchrow_array)
{
    #Write an array into a row in the spreadsheet.
    $worksheet->write_row($row++, $col, \@data);
}

Excelスプレッドシートが必要ない場合は、CPANで目的の形式のモジュールを 検索するか、たとえばText::CSV、任意のスプレッドシートに簡単にインポートできるCSVファイルを作成してみてください。

于 2012-10-05T08:12:09.047 に答える