0

私のクエリは機能していますが、クエリから作成された列の合計を計算する必要があります。通常の php スクリプトを使用して、累積労働時間の値 (金額) を追加しています。これも完全に機能します。しかし、この列の合計または合計を取得するにはどうすればよいですか。これにより、エコー行で「....期間の累積給与は_」として使用される単一の数値が得られます。スクリプトの最後の2番目の行を参照してください。

以下は、スクリプトの抜粋です。

<?php
    include("../xxx");
    $cxn = mysqli_connect($host,$user,$password,$dbname)
        or die ("Couldn't connect to server.");
    $query = "SELECT 
                ea.`employee_id`, 
                e.`employee_surname`, 
                e.`employee_first_name`, 
                e.`employee_second_name`,
                e.`employee_salary`, 
                FORMAT((IF((SUM(ea.`empl_attendance_total`))<180,(SUM(ea.`empl_attendance_total`)),180)),1) AS nt,
                FORMAT((IF(((SUM(ea.`empl_attendance_total`))-(SUM(CASE WHEN WEEKDAY(ea.empl_attendance_date) > 5 THEN ea.empl_attendance_total END)))<=180,
                    0,(IF(((SUM(ea.`empl_attendance_total`))-(SUM(CASE WHEN WEEKDAY(ea.empl_attendance_date) > 5 THEN ea.empl_attendance_total END)))>180,
                    ((SUM(ea.`empl_attendance_total`))-(SUM(CASE WHEN WEEKDAY(ea.empl_attendance_date) > 5 THEN ea.empl_attendance_total END)))-180,
                0)))),1) AS ot,
                FORMAT((IF((SUM(ea.`empl_attendance_total`))>180,
                IF((SUM(ea.`empl_attendance_total`))-180>=(SUM(CASE WHEN WEEKDAY(ea.empl_attendance_date) > 5 THEN ea.empl_attendance_total END)),
                (SUM(CASE WHEN WEEKDAY(ea.empl_attendance_date) > 5 THEN ea.empl_attendance_total END)),(SUM(ea.`empl_attendance_total`))-180),
                0)),1) AS st,
                FORMAT((SUM(ea.`empl_attendance_total`)),1) AS total
            FROM
                empl_attendance ea 
            JOIN 
                employee e 
            ON ea.`employee_id` = e.`employee_id` 
            WHERE  ea.`empl_attendance_date` BETWEEN '$start_date' AND '$end_date' 
            GROUP BY `employee_id`";
    $result = mysqli_query($cxn,$query)
        or die ("Couldn't execute query.");
$total_salary = 0; 
    /* Displays items already in table */
    echo "<table><br>
    <tr>
     <th>Empl No</th>
     <th>Empl Name</th>
     <th>N/T (1.0)</th>
     <th>O/T (1.5)</th>
     <th>S/T (2.0)</th>
     <th>Total Hrs</th>
     <th>Est Salary</th>
    </tr>";

while($row = mysqli_fetch_assoc($result)) 
{ 
    extract($row); 
    $sal = ((($employee_salary/180)*$nt)+((($employee_salary/180)*$ot)*1.5)+((($employee_salary/180)*$st)*2)); 
    $salary = number_format($sal, 2, '.', ','); 

    // add this salary to the total 
    $total_salary += $sal; 

    echo "<tr>\n
            <td>$employee_id</td>\n
            <td>$employee_surname, $employee_first_name $employee_second_name</td>\n
            <td>$nt</td>\n
            <td>$ot</td>\n
            <td>$st</td>\n
            <td>$total</td>\n
            <td>R $salary</td>\n
            </tr>\n"; 
} 
    // change the format of the salary variable
$acc_sal = number_format($total_salary, 2, '.', ',');
echo "</table><br>"; 
echo "Accumulated Salary for the selected period is<b> R $acc_sal<b>";
?>
4

2 に答える 2

0

GROUP BY を 1 つの列でのみ使用しているため、WITH ROLLUP オプションを確認してください。これにより、データベースからもう 1 行が返されます。

これを行う場合は、コードに大きなコメントを残してください。将来の開発者は追加の行を期待していない可能性があるためです。

于 2012-09-06T16:48:13.533 に答える
0

$total_salaryこれを行うかなり簡単な方法は、ループの前に新しい変数 (たとえば ) を定義しwhile、それに各給与を追加することです。

したがって、次のようになります(コードは多少切り捨てられています):

...
$total_salary = 0;

while($row = mysqli_fetch_assoc($result))
{
    extract($row);
    $sal = ((($employee_salary/180)*$nt)+((($employee_salary/180)*$ot)*1.5)+((($employee_salary/180)*$st)*2));
    $salary = number_format($sal, 2, '.', ',');

    // add this salary to the total
    $total_salary += $sal;

    echo "... row markup ...";
}
echo "</table><br>";
echo "<b> Accumulated Salary for the selected period is $total_salary<b>";

PS: それは素晴らしいクエリです!!! :)

于 2012-09-06T14:55:20.597 に答える