Как преобразовать результаты SQL-запроса в сводную таблицу с помощью массивов php?

Я пытаюсь создать статистику для системы бронирования библиотеки. Результат моего sql-запроса выглядит следующим образом.

total_no_students | отдел | собственность | месяц
241 | Физика бакалавриат | ноябрь
236 | Физика бакалавриат | декабрь
254 | Физика аспирант | ноябрь
210 | Физика аспирант | декабрь
193 | Архитектура | бакалавриат | ноябрь
181 | Архитектура | бакалавриат | декабрь
127 | Архитектура | аспирант | ноябрь
292 | Архитектура | аспирант | декабрь
134 | Биология бакалавриат | ноябрь
188 | Биология бакалавриат | декабрь
129 | Биология аспирант | ноябрь
219 | Биология аспирант | декабрь

Я пытаюсь использовать php для написания кода для создания таблицы статистики со следующим видом:

| Физико-старшекурсник | Физико-послевузовская | Архитектура-старшекурсник | Архитектура-послевузовский |
Ноя | 241 | 254 | 193 | 127 |
Дек | 236 | 210 | 181 | 292 |

Я должен преобразовать его с помощью php (техника разворота), используя массивы и некоторые циклы (foreach). Я пытался сделать это, но меня смущают вложенные циклы.

Код, который я написал, выглядит следующим образом:

$ csvArray = array (); $ департаменты = массив («Физика», «Архитектура», «Биология»);
$ properties = array («бакалавр», «аспирант»);

$ con = mysqli_connect ($ mysql_hostname, $ mysql_user, $ mysql_password, $ mysql_dbname);

$ sql = "SELECT count (id) как total_no_students, отдел, свойство, MONTH (table1.created) как месяц

ИЗ таблицы 1
оставил JOIN table2
ON table2.barcode = table1.input

группировка по отделу, имуществу, месяцу ";

$ Рез = mysqli_query ($ против, $ SQL);

в то время как ($ строка = mysqli_fetch_array ($ разреш)) {

$ time = $ row ['month'];

if (! array_key_exists ($ time, $ csvArray)) {
foreach ($ департаменты как $ отдел) {
$ csvArray [$ Department] = array ();
foreach ($ properties как $ property) {
$ csvArray [$ Department] [$ property] = array ();

}
}
}
$ отдел = $ строка ['отдел'];
$ property = $ row ['property'];
$ total_no_students = $ row ['total_no_students'];

$ csvArray [$ time] [$ департаментов] [$ property] = $ total_no_students;

}

Любая помощь, как преобразовать запрос с помощью PHP в приведенной выше таблице?

2

Решение

select "month",
SUM(case when department = 'Physics' and property = 'undergraduate' then total_no_students else 0 end) as "Physics-undergrad",
[...]
from table_name
group by "month"
1

Другие решения

Предполагая, что вы начинаете со следующей структуры массива:

Array
(
[0] => Array
(
[total_no_students] => 241
[department] => Physics
[property] => undergraduate
[month] => Nov
)

[1] => Array
(
[total_no_students] => 236
[department] => Physics
[property] => undergraduate
[month] => Dec
)
...

Тогда следующий цикл foreach:

$new_array = Array();
foreach( $old_array as $v )
{
if(!isset( $new_array[$v["month"]][($v["department"].'-'.$v["property"])] ))
{
$new_array[$v["month"]][($v["department"].'-'.$v["property"])] = 0;
}
$new_array[$v["month"]][($v["department"].'-'.$v["property"])] += $v["total_no_students"];
}

Будет производить следующее:

Array
(
[Nov] => Array
(
[Physics-undergraduate] => 241
[Physics-postgraduate] => 254
[Architecture-undergraduate] => 193
[Architecture-postgraduate] => 127
[Biology-undergraduate] => 134
[Biology-postgraduate] => 129
)

[Dec] => Array
(
[Physics-undergraduate] => 236
[Physics-postgraduate] => 210
[Architecture-undergraduate] => 181
[Architecture-postgraduate] => 292
[Biology-undergraduate] => 188
[Biology-postgraduate] => 219
)

)

Затем вы можете отобразить, что вы хотите …

1

По вопросам рекламы [email protected]