2012-09-06 69 views
0

我的查詢正在工作,但我需要計算從查詢中創建的列的總數,我使用普通的php腳本來添加值(在金錢上)累積的工作時間,這也是完美的。但是,我怎麼那麼得到的合計或總計此列,它應該給我一個單一的數字,在回聲線所用的「......期間累積的工資是_」,看到倒數第二行從我的腳本。如何計算從查詢創建的臨時列的SUM

以下是腳本的文檔片斷:

<?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>"; 
?> 

回答

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>"; 

P.S:這是一個真棒查詢! :)

+0

thanx的幫助@froddd,公式給了我錯了,雖然總量,但修復是一個容易 - 我已經更新了我原來的劇本與更正,現在是工作的罰款。 –

+0

Thanx for help @froddd,雖然公式給了我一個錯誤的總數,但修復很容易 - 試圖表達格式化的數字給出了錯誤的總數,所以我只使用了未格式化的變量($ sal)並格式化了它後來用劇本。我用更正更新了原始腳本,現在工作正常。再一次,非常感謝你指點我在正確的方向...... Jay –

+0

哦,是的,我應該注意到'$ salary'是格式化的......顯然需要使用'$ sal'。 Do'h!我已經更新了答案,如果這對您有用,請隨時接受。 – froddd

0

既然你只對一列使用GROUP BY,檢查出WITH ROLLUP選項,這將返回從數據庫中多了一個排。

如果你這樣做,留在你的代碼,一個巨大的評論,因爲未來的開發人員可能不希望額外的行。

+0

嗨@Alain Collins,我從來沒有聽說過WITH ROLLUP,因此你可以肯定我會研究這個,也許不是我會在這裏使用的東西,但我可能有一個它可以派上用場的地方。謝謝你的反饋...... Jay –