#php #javascript #html
#php #javascript #HTML
Вопрос:
У меня есть набор результатов, который суммирует итоги для N ситуаций и N разных кодов за определенный период.
Данные поступают из этого SQL
SELECT *, count(fldA) as ca
FROM table
WHERE ('... month/year ...')
GROUP BY Sit, Cod
ORDER BY count(fldA) DESC;
Хорошо, вот таблица, которую я хочу:
--------------------------------
| d/l | Sit. A | Sit. B | Sit. N |
----- -------- -------- --------
| c91 | 10 | 05 | 10 |
----- -------- -------- --------
| c93 | 15 | | |
----- -------- -------- --------
| cN. | 07 | 01 | |
----- -------- -------- --------
| Tot | 22 | 06 | 10 |
--------------------------------
Таким образом, соответствующий массив (resultset) для приведенной выше таблицы должен быть чем-то вроде:
SitA, C93, 15;
SitN, c91, 10;
SitA, c91, 10;
SitA, CN., 07;
SitB, c91, 05;
SitB, cN., 01;
Обратите внимание, что количество ситуаций (столбцов) и кодов (строк) БУДЕТ ОТЛИЧАТЬСЯ. И бывают случаи, когда в массиве результирующего набора не должно быть значения для некоторой комбинации строк col x.
Очевидно, что итоговые данные должны быть рассчитаны впоследствии.
Вопрос в том … какой наилучший подход для такого типа результирующего набора => создание таблицы? Предпочтительно использовать только один SQL-запрос.
Ответ №1:
Итак, поскольку помощь не приходит… я сделал это
<?php
…
$sql="";
function timeFilter(){
$q="";
if ($_GET['mes']!='' || $_GET['ano']!=''){ $q.=" WHERE";}
if ($_GET['mes']!=''){ $q.=" MONTH(ouventrada)=$_GET[mes]";}
if ($_GET['mes']!='' amp;amp; $_GET['ano']!=''){ $q.=" AND";}
if ($_GET['ano']!=''){$q.=" YEAR(ouventrada)=$_GET[ano]";}
return $q;
}
// we gonna use two buffers for collumns and rows...
function fillBuff (amp;$buff, $fld){
$buff = array();
$sql = "SELECT $fld FROM ouv" . timeFilter() . " GROUP BY $fld";
$res = mysql_query($sql);
while ($row=mysql_fetch_assoc($res)){
$buff[]=$row[$fld];
}
}
$quad .= "<div id='stats'>";
// Fill buffers
$buffatc = array();
$bufftipo = array();
fillBuff ($buffatc, 'ouvatc');
fillBuff ($bufftipo, 'ouvtipo');
// Table headers
$tbl = "<table class='resumo'>";
$tbl.= "<thead><tr><th></th>";
foreach ($bufftipo as $l){
$tbl.="<th>$l</th>";
}
$tbl.="</tr></thead>";
// Table foot (Totals)
$tbl.="<tfoot><tr style='background-color: #f0f0f0'><td style='font-size: 50%;'>Total</td>";
foreach($bufftipo as $l){
$sql="SELECT count(*) AS ca FROM ouv" . timeFilter();
$sql.= (strpos($sql,"WHERE"))?" AND":" WHERE";
$sql.=" ouvtipo='$l'";
$rowt = mysql_fetch_assoc(mysql_query($sql));
$tbl.="<td style='font-weight: bold'>$rowt[ca]</td>";
}
$tbl.="</tfoot>";
// Table Body
$tbl.="<tbody>";
foreach ($buffatc as $r){ //data
$tbl.="<tr>";
$tbl.="<td style='font-size: 50%;'>$r</td>";
foreach($bufftipo as $l){
$sql="SELECT count(*) as ca FROM ouv " . timeFilter();
$sql.= (strpos($sql,"WHERE"))?" AND":" WHERE";
$sql.=" ouvatc='$r' AND ouvtipo='$l'";
$rowt = mysql_fetch_assoc(mysql_query($sql));
$tbl.="<td style='font-weight: bold'>$rowt[ca]</td>";
}
$tbl.="</tr>";
}
$tbl.="</tbody>";
$tbl .="</table>";
$quad.= $tbl;
$quad.= "</div>";
Мы взаимодействуем через два «буфера» для столбцов и строк, устанавливая sql для вычисления каждой ячейки за раз…
gl, спасибо
Paulo Bueno.