Отображать названия месяцев вертикально, а не горизонтально - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть таблица, которая отображает месяцы (с января по декабрь) в таблице следующим образом.
Эта таблица получает значения из базы данных, и она не является фиксированной.

<table width="100%" style="font-size:9px">
<thead>
<tr>
<th colspan="14" style="text-align:center">Year: <?PHP echo $year?></th>
</tr>
<tr >
<th>Jan</th>
<th>Feb</th>
<th>Mar</th>
<th>Apr</th>
<th>May</th>
<th>Jun</th>
<th>Jul</th>
<th>Aug</th>
<th>Sep</th>
<th>Oct</th>
<th>Nov</th>
<th>Dec</th>
<th>Total</th>
</tr></thead><tbody>   
<tr > 
<?PHP 
for ($i=1; $i<=12; $i++) {
    $yearstart = $year."-".$i."-01";
    $yearend = $year."-".$i."-31";
    $sql="SELECT SUM(total) as totalsales_$i from salesorder where user_id=7 and created  BETWEEN '$yearstart' AND '$yearend' ";
    $res = $db->sql_query($sql);
    $row =  $db->sql_fetchrow($res);
    $total = $total + $row['totalsales_'.$i];
?>
<td style="width: 96px; text-align:right">
<?PHP if ($row['totalsales_'.$i] !='' ) 
    echo "$".number_format($row['totalsales_'.$i],2);
  else     
    echo "<font color=#c2c2c2>$0.00</font>";?>
 </td>
<?PHP //for ?> 
<td style="text-align:right"><?PHP echo "$".number_format($total,2) ;?></td>
</tr>                                       
</tbody></table>

OUTPUT:
    Jan    feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec    Total
    $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0
    $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0
    $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0     $0
    ...
    ...

Но мне нужно, чтобы таблица отображалась вертикально, как показано ниже

                2011    2012    2013    ...

    Jan         $0.00   $0.00   $0.00   $0.00
    feb         $0.00   $0.00   $0.00   $0.00
    Mar         $0.00   $0.00   $0.00   $0.00
    Apr         $0.00   $0.00   $0.00   $0.00
    May         $0.00   $0.00   $0.00   $0.00
    Jun         $0.00   $0.00   $0.00   $0.00
    Jul         $0.00   $0.00   $0.00   $0.00
    Aug         $0.00   $0.00   $0.00   $0.00
    Sep         $0.00   $0.00   $0.00   $0.00
    Oct         $0.00   $0.00   $0.00   $0.00
    Nov         $0.00   $0.00   $0.00   $0.00
    Dec         $0.00   $0.00   $0.00   $0.00
    Total       $0.00   $0.00   $0.00   $0.00

Я пробовал несколько разных способов, но не повезло. Хотел бы я показать вам некоторый код о том, что я пытался, но у меня действительно нет муравья, чтобы показать.

Кто-нибудь знает, как отобразить эту таблицу по вертикали?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

Вы можете сначала получить данные из базы данных и сохранить их доступным способом в массив, например:

$array[$year][$monthOrTotal] = $value;

Затем вы можете выполнить итерацию по этому массиву, чтобы вывести вашу таблицу в любом направлении:

$cols = array('2011', '2012', '2013');
$rows = explode(',', 'Jan,feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec,Total');

echo '<table>', '<tr>', '<th></th>';
foreach($cols as $col)
{
   echo '<th>', $col, '</th>';
}
echo '</tr>';

foreach($rows as $row)
{
    echo '<tr>', '<th>', $row, '</th>';
    foreach($cols as $col)
    {
        echo '<td>', $array[$col][$row], '</td>';
    }
   echo '</tr>';
}
echo '</table>';

(Предупреждение о непроверенном коде)

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

0 голосов
/ 05 ноября 2011

Прежде всего, вы можете прекратить выполнение 12 n запросов и получить всю информацию за один раз и с мощным механизмом агрегирования в MySQL:

SELECT 
    YEAR(created) as `Y`, 
    MONTH(created) AS `M`, 
    SUM(total) AS `SUM` 
FROM 
    salesorder
WHERE
    user_id = 7
GROUP BY 
    YEAR(created), 
    MONTH(created) 
WITH ROLLUP

это приведет к такому результату:

Y    | M    | SUM
2011 | 10   | 20.00
2011 | 11   | 10.00
2011 | 12   | 5.00
2011 | NULL | 35.00     // M == NULL -> sum for this year
2012 | 1    | 7.00
2012 | 2    | 7.00
2012 | NULL | 14.00
NULL | NULL | 49.00     // M & Y == NULL -> sum for whole resultset

Таким образом, у вас будет сумма для отдельных месяцев в каждой строке, сумма для каждого года, если столбец M равен нулю, и сумма для всего результата в последней строке (вы можете отменить его, если он вам не нужен)

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

$tableRows = array(
    0 => array( // 0 will be for sum from each year
             2011 => 0,
             2012 => 0
    ),
    1 => array( // January
             2011 => 0
    ...
);

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

$years = array();
while($dbRow = $res->fetchAssoc()){
    $y = intval($dbRow['Y']);
    if($y){
        $m = intval($dbRow['M']);
        $tableRow[$m][$y] = $dbRow['SUM'];
    }    
}
$allYears = array_keys($tableRows[0]); // get all years we have

Наконец, вы можете представить его в своей таблице:

<table>
   <thead>
     <tr>
       <th>Month</th>
       <?php foreach($allYears as $year): ?>
       <th><?=$year?></th>
       <?php endforeach; ?>
     </tr>
   <thead>
   <tfoot>
   <? foreach($tableRows as $month => $years): ?>
   <tr>
      <td><?=$month?></td>
   <?php foreach($allYears as $y): ?>
      <td><?=$years[$y]?></td>
   <?php endforeach; 
   if(!$month): ?>
   </tr>
   </tfoot>
   <tbody>
   <?php else: ?>
   </tr>
   <?php endif;
   endforeach; ?>
   </tbody>
</table>

Что нужно исправить, так это отобразить название месяца и Total вместо цифр в первом столбце

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...