Вот две структуры таблиц (сокращены для MCVE - здесь больше строк не нужно):
++++++++++++++++++++++++++++++++ FEES ++++++++++++++++++++++++++++++++++
fee_id +++ fee_amount +++ fee_date +++ fee_student_ID +++ fee_paid +++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 +++ 200 +++ 2019-12-05 +++ 1 +++ N ++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 +++ 200 +++ 2020-01-05 +++ 1 +++ N ++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 +++ 200 +++ 2020-01-05 +++ 1 +++ N ++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 +++ 250 +++ 2020-01-05 +++ 2 +++ N ++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 +++ 250 +++ 2020-02-05 +++ 2 +++ N ++++
Таблицы связаны -> fee_student_ID = student_ID
++++++++++++++++++++ STUDENTS +++++++++++++++++++++
student_ID +++ student_name +++ student_phone +++
+++++++++++++++++++++++++++++++++++++++++++++++++++
1 +++ John Doe +++ 123456789 +++
+++++++++++++++++++++++++++++++++++++++++++++++++++
2 +++ Jane Doe +++ 987654321 +++
С помощью моего запроса SQL я могу получить и упорядочить данные (мне нужны только строки, в которых "paid" опаздывает / скоро будет). Что мне нужно, это:
- группировать по годам
- сумма сумм по годам
Я достиг # 1, как это (и это работает, как ожидалось):
$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $adminDBuser, $adminDBpwd);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $pdo->prepare(" SELECT tbl_fees.*, tbl_students.*, YEAR(tbl_fees.fee_date) AS yearfee
FROM tbl_fees, tbl_students
WHERE tbl_fees.fee_student_ID=tbl_students.student_ID
AND tbl_fees.fee_paid='N'
AND tbl_fees.fee_date <= DATE_ADD(NOW(), INTERVAL 7 DAY)
ORDER BY tbl_fees.fee_date ");
$stmt->execute();
$results = $stmt->fetchAll();
foreach( $results as $row ) {
if ($row['yearfee'] != $yearfee) {
echo "<tr colspan=\"5\" class=\"table-title-year\"><td class=\"table-title-year\">
". $row['yearfee']."
</td></tr>";
//**-- adds a row on top of the list, with the YEAR, and splits the data => OK
}
echo"<tr><td>$fee_id</td><td>",my_formated_date($fee_date),"</td>
<td><a href=\"/student-data.php?id=$student_ID\">$student_name</a></td>
<td>$fee_amount</td><td>$fee_paid</td></tr>\n\r";
}
Теперь, что я хочу добавить, это еще один, в нижней части каждого "разбивки по годам". В этой строке будет показана общая сумма невыплаченных / скоро подлежащих оплате сборов. Как показано ниже, ожидаемый результат:
-----------------------------------------
YEAR : 2019
-----------------------------------------
1 --- John Doe --- 2019-12-05 --- 200 ---
-----------------------------------------
TOTAL : 200
-----------------------------------------
YEAR : 2020
-----------------------------------------
2 --- John Doe --- 2020-01-05 --- 200 ---
3 --- Jane Doe --- 2020-01-05 --- 250 ---
4 --- John Doe --- 2020-02-05 --- 200 ---
5 --- Jane Doe --- 2020-02-05 --- 250 ---
-----------------------------------------
TOTAL : 900
-----------------------------------------
Как мне получить приведенную выше таблицу, используя запрос SQL или PHP?
I ' мы искали MySQL (и другие связанные темы в do c) и этого урока (среди прочих), но не можем найти способ адаптировать его к моему case.
Я тестировал что-то вроде этого, с одним годом или для каждого известного отдельного года (все равно все ошибки выбрасывания ...):
- SUM (tbl_fees.fee_amount ) ФИЛЬТР (ГДЕ ВЫПИСАТЬСЯ (ГОД ОТ tbl_fees.fee_date) = 2019) AS yearSumTotal1
- СУММА (tbl_fees.fee_amount) ГДЕ ВЫДЕРЖАТЬ (ГОД ОТ tbl_fees.fee_date) = 10 * 101 AS1 910