2016-09-24 4 views
2

Заранее благодарим за подробную помощь и ответы.Общее число столбцов в зацикленной таблице (не общая сумма запроса)

Я был в тупике в течение нескольких недель. Изучал онлайн и не мог понять это. Пожалуйста помоги.

Важно отметить, что столбец, который я пытаюсь получить, НЕ хранится в моей базе данных sql. SELECT SUM не будет работать для этого. Я также предпочел бы не писать колонку SUBTOTAL в sql - потому что, если мне нужно будет изменить часы или скорость (если бы была клерикальная ошибка), я бы скорее просто изменил 1 поле, чем 2.

Вот что моя таблица выглядит, заселена из SQL запроса: table looks like

Где таблица говорит TOTAL, мне нужно, чтобы сложить столбец над ней и заполнения общей.

Вот мой код - это долго, потому что я включаю все, если вам это нужно.

$staffquery = mysqli_query($con, "SELECT * FROM kmis_transcribers WHERE transcriber_projectid = '$projectinvoiceid ' ORDER BY transcriber_calltime ASC"); 

$staffcount = mysqli_num_rows($staffquery); 
for($i=0; $i<$staffcount; $i++) { 
$staffarray = mysqli_fetch_array($staffquery); 
$staffid = $staffarray['transcriber_id']; 
$staffregid = $staffarray['transcriber_registryid']; 
$staffposition = $staffarray['staff_position']; 
$staffcalltime = $staffarray['transcriber_calltime']; 
$staffrate = $staffarray['staff_rate']; 
$staffhours = $staffarray['transcriber_hours']; 
$staffovertime = $staffarray['transcriber_overtime']; 


echo('<tr> 

    <td align="center" style="border:1px solid #000000; padding:3px">$'.$staffrate.'</td> 
    <td align="center" style="border:1px solid #000000; padding:3px">'); 

$invoicequery = mysqli_query($con, "SELECT * FROM kmis_invoices WHERE invoice_staffid='$staffid'"); 
    while ($invoicearray = mysqli_fetch_array($invoicequery)) { 
      echo(''.$invoicearray['invoice_hours'].''); 
} 
    echo('</td> 
     <td align="center" style="border:1px solid #000000; padding:3px">'); 

$invoicequery = mysqli_query($con, "SELECT * FROM kmis_invoices WHERE invoice_staffid='$staffid'"); 
    while ($invoicearray = mysqli_fetch_array($invoicequery)) { 
      echo(''.$invoicearray['invoice_overtime'].''); 
} 
     echo('</td> 
     <td align="center" style="border:1px solid #000000; padding:3px">'); 

$invoicequery = mysqli_query($con, "SELECT * FROM kmis_invoices WHERE invoice_staffid='$staffid'"); 
    while ($invoicearray = mysqli_fetch_array($invoicequery)) { 
      $invoicehours= $invoicearray['invoice_hours']; 
      $invoiceovertime= $invoicearray['invoice_overtime']; 

    $subtotal = ($invoicehours*$staffrate)+($invoiceovertime*$staffrate*1.5); 
    $subtotalformat = number_format((float)$subtotal, 2, '.', ''); 

     echo('$'.$subtotalformat.''); 
} 
    echo('</td> 
    </tr>'); 
} 
    echo('<tr> 
     <td align="center" style="border:1px solid #000000; padding:3px"></td> 
     <td align="right" style="border:1px solid #000000; padding:3px" colspan="4"><b>TOTAL DUE:</b></td> 
     <td align="center" style="border:1px solid #000000; padding:3px"><b>TOTAL</b></td> 
     </tr> 

Вы можете видеть, что формула я использую для создания столбца субтотального использует четыре различных запросов - от счетов-фактур и от персонала. Некоторые сотрудники имеют разные ставки, поэтому промежуточный итог основан на данных, которые могут быть полностью разными для строк.

Я думаю, что ответ лежит в array_sum и с использованием массива для хранения всех $ subtotal, когда они заполнены, но я полностью в тупике.

Благодарим вас искренне. Пожалуйста, дайте мне знать, если вы хотите, чтобы я уточнил или помог сделать это более точным.

+0

Я не совсем понимаю вашу проблему. Я дал ответ на ваши проблемы, поскольку мне кажется, что это очень просто. Хостинг, чтобы получить от вас отзыв –

ответ

2

Я прочитал вашу проблему problem.The кажется довольно простым для меня, но ваш код все перепутались up.What я понял, был ваш общий будет сумма всех субтотальных значений, так

Total= 40$ + 108$ = 148$ //from your shown data in fig 

Инициализировать переменную $ всего за пределами вашей цикл

$total=0; 
    for($i=0; $i<$staffcount; $i++) { 

После рассчитать субтотальную значение, добавьте это к общей сумме, как указано ниже

$subtotal = ($invoicehours*$staffrate)+($invoiceovertime*$staffrate*1.5); 
$total=$total + $subtotal; 
$subtotalformat = number_format((float)$subtotal, 2, '.', ''); 

Наконец поставить значение вычисленной $ Всего в результате, как

echo('<tr> 
     <td align="center" style="border:1px solid #000000; padding:3px"></td> 
     <td align="right" style="border:1px solid #000000; padding:3px" colspan="4"><b>TOTAL DUE:</b></td> 
     <td align="center" style="border:1px solid #000000; padding:3px"><b>TOTAL : '.$total.'</b></td> 
     </tr> 

Ваш код PHP выглядит очень длинным и перепутались, поэтому я предлагаю вам попробовать этот запрос, чтобы сделать его коротким.

SELECT 
    t1.transcriber_id staff, 
    t1.staff_position position, 
    t1.staff_rate Rate, 
    t2.invoice_hours hours, 
    t2.invoice_overtime 'OT x 1.5', 
    (t2.invoice_hours * t1.staff_rate) + (t2.invoice_overtime * t1.staff_rate * 1.5) subtotal 
FROM 
    kmis_transcribers t1 
     JOIN 
    kmis_invoices t2 ON (t1.transcriber_id = t2.invoice_staffid) 
WHERE 
    t1.transcriber_projectid=1 //$projectinvoiceid in your case 

Этот запрос возвращает вид, что вы хотите, и ваш код PHP будет гораздо просто сейчас, как теперь вместо четырех запросов требуется только один запрос.

+0

Киран, спасибо вам за вашу помощь и предложения. Я по-прежнему изучаю лучшие и правильные способы сделать мой код более точным, большое спасибо за последнее предложение по очистке моего кода. – userK1400

+0

Я понял, что ответ на это было легко, но я не мог обдумать его. - Я хотел, чтобы вы знали, что я видел ваш ответ, и я хочу попытаться реализовать его сегодня или завтра (рабочий проект займет мое время в этот уик-энд), и вы точно знаете, как это работает для меня. только вопрос: мне нужно инициализировать общую переменную ($ total = 0 и т. д.) в с TOTAL: '. $ total.' ? – userK1400

+0

@ userK1400 Продолжайте пытаться и никогда не сдаваться. $ total содержит сумму всех промежуточных итогов, поэтому ее необходимо инициализировать выше цикла, в котором вы получаете промежуточные итоги. После того, как цикл будет выполнен, сумма $ total теперь содержит сумму всех промежуточных итогов. Теперь это можно использовать для отображения с TOTAL:. '$ Total.'. Попробуйте это, чтобы вы лучше учились. Если вы застряли, мы вам поможем :) –