2011-11-05 3 views
0

다음과 같이 테이블에 달 (1 월에서 12 월까지)을 표시하는 테이블이 있습니다.
이 테이블은 데이터베이스에서 값을 가져 오며 고정되어 있지 않습니다.가로로 표시하지 않고 가로로 월 이름을 표시합니다.

<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 
나는 몇 가지 방법을 시도

,하지만 행운을 다음과 같이 수직으로 테이블을 표시하는 방법입니다. 나는 내가 시도한 것에 대해 당신에게 약간의 코드를 보여줄 수 있었으면 좋겠지 만, 나는 보여줄 것이 전혀 없다.

누군가이 테이블을 유심히 표시하는 방법을 알고 있습니까?

답변

0

첫째, 당신은 12 개 N 쿼리를 실행 중지와 MySQL에서 하나 개의 이동 및 응집 메커니즘의 힘으로 모든 정보를 얻을 수도 있습니다

M 열이 마지막 행에서 전체 결과 (당신이 그것을 필요하지 않은 경우 당신이 그것을 삭제할 수 있습니다)에 대한 널 (null)과 합계 경우
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 

그래서 당신은, 모든 행에 매년 금액을 개별 개월 합계를해야합니다

이제 테이블에 행을 추가하는 동안 반복하기 쉬운 다른 배열을 만들어야합니다. I는 다음과 같이 그것을 제안 :

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

난 당신이 데이터베이스와 상호 작용하는 데 사용하고있는 클래스를 알고, 그래서 내가 거기에 생각하지 않습니다는 결과 집합에서 연관 배열을 가져올 수 있도록 몇 가지 방법입니다

수정에 필요한 사항을

<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 대신 전나무의 번호 :

$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 

마지막으로 당신은 당신의 표에서 제시 할 수 있습니다 t 열

+0

dev-null-dweller 감사합니다. 그것은 완벽하게 작동했습니다. – librium

2

먼저 데이터베이스에서 데이터를 얻기과 같은 배열로 접근 방법으로 저장할 수 있습니다 :

$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>'; 

(테스트되지 않은 코드 경고)

이것은 당신이 당신의 저장 및 그것의 출력에서 ​​데이터를 얻는 부분을 분리 한 다. 이는 일반적으로 출력 논리와 문제를 섞어서 데이터를 얻지 않기 때문에 바람직합니다. 그러면 문제가 줄어 듭니다.

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 

는이 같은 결과 집합가 발생합니다 : 모든

+0

감사합니다. 시도해 보겠습니다. – librium

관련 문제