Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rrh

montar tabela na horizontal

Recommended Posts

Ao realizar uma consulta e montar uma tabela com um loop os resultados são mostrados em linhas na vertical. É possível fazer com que os resultados sejam montados na horizontal?

 

 

Exemplificando para tentar passar melhor a minha dúvida:

 

 

Eu consigo o resultado assim:

 

Estado|Marca|Total

SP |VW |10

SP |FIAT |30

SP |MB |15

SP |FORD |28

 

 

Eu gostaria de fazer assim:

 

Estado|VW|FIAT|MB|FORD

SP |10|30 |15|28

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo deve ter alguma maneira mais fácil mas a única maneira que me veio a cabeça foi esta abaixo.

 

<?php
	$query = mysql_query("SELECT estado FROM suaTabela");
	$query2 = mysql_query("SELECT marca FROM suaTabela");
	$query3 = mysql_query("SELECT total FROM suaTabela");
?>
<table>
	<tr>
		<td> estado </td>
		<td>
			<?php
				for($x = 1; $x < = mysql_num_rows($query); $x++){
					list($estado) = mysql_fetch_array($query);
					echo $estado;
				}
			?>
		</td>
	</tr>
	<tr>
		<td> Marca </td>
		<td>
			<?php
				for($x = 1; $x < = mysql_num_rows($query2); $x++){
					list($marca) = mysql_fetch_array($query2);
					echo $marca;
				}
			?>
		</td>
	</tr>
	</tr>
		<td> Total </td>
		<td>
			<?php
				for($x = 1; $x < = mysql_num_rows($query3); $x++){
					list($total) = mysql_fetch_array($query3);
					echo $total;
				}
			?>
		</td>
	</tr>
</table>

Mas não aconselharia você a fazer este tipo de listagem tendo em mente que irá passar da tela ao chegar uma certa quantidade de registros criando um scroll na parte inferior do browser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que não consegui explanar bem a minha dúvida! Olha o resultado do seu código:

 

 

Estado|SPSPSPSP

Marca|VWFIATMBFORD

Total|10301528

 

 

Eu gostaria de fazer assim:

cabeçalho da tabela Estado|VW|FIAT|MB|FORD


resultado da consulta SP|10|30 |15|28

resultado da consulta MG|10|30 |15|28

resultado da consulta RJ|10|30 |15|28

resultado da consulta SC|10|30 |15|28

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, parece que o que eu preciso se chama crosstab. Pesquisando encontrei aqui o PHP Report Maker que monta a tabela como eu preciso, mas para o resultado abaixo o programa gera vários arquivos e diretórios. Não tem uma forma mais simples de fazer isso?

 

4rpd.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT
	estado,
	SUM(IF(marca = 'FORD',total,0)) AS "Ford",
	SUM(IF(marca = 'FIAT',total,0)) AS "FIAT",
	SUM(IF(marca = 'MB',total,0)) AS "MB",
	SUM(IF(marca = 'VW',total,0)) AS "VW",
	SUM(COALESCE(total,0)) as "Total"
FROM
	veiculos
GROUP BY 1

resultado na minha tabela de testes

+--------+------+------+------+------+-------+
| estado | Ford | FIAT | MB   | VW   | Total |
+--------+------+------+------+------+-------+
| PR     |    0 |    0 |   20 |   15 |    35 |
| SP     |   35 |  105 |    0 |    0 |   140 |
+--------+------+------+------+------+-------+

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro hufersil, obrigado pela ajuda. Tem como também inserir uma linha de total para as colunas? Pra exibir o resultado que você postou acima você fez a consulta no console do MySQL, correto? Agora como montar essa tabela no php?

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT
	estado,
	SUM(IF(marca = 'FORD',total,0)) AS "Ford",
	SUM(IF(marca = 'FIAT',total,0)) AS "FIAT",
	SUM(IF(marca = 'MB',total,0)) AS "MB",
	SUM(IF(marca = 'VW',total,0)) AS "VW",
	SUM(COALESCE(total,0)) as "Total"
FROM
	veiculos
GROUP BY 1
WITH ROLLUP

O ROLLUP irá trazer uma linha totalizadora para cada agrupamento.

Como você só está agrupando por uma coluna, a última linha do resultado virá com o valor de "Estado" = NULL e a soma de cada coluna.

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como vai ficar o código php para gerar uma tabela como é feito no phpmyadmin?

 

 

knro.jpg

 

[inline]while[/inline] nesse caso não vai dar certo né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

claro que sim ;-)

 

$sql = <<<SQL
	SELECT
		estado AS "ESTADO",
		SUM(IF(marca = 'FORD',total,0)) AS "FORD",
		SUM(IF(marca = 'FIAT',total,0)) AS "FIAT",
		SUM(IF(marca = 'MB',total,0)) AS "MB",
		SUM(IF(marca = 'VW',total,0)) AS "VW",
		SUM(COALESCE(total,0)) as "TOTAL"
	FROM
		veiculos
	GROUP BY 1
	WITH ROLLUP
SQL;
	
$rs = mysql_query($sql) OR die(mysql_error());

// montando o header da tabela
$header = array();
for($i=0, $total=mysql_num_fields($rs); $i<$total; $i++){
	$header[] = mysql_field_name($rs, $i);
}

$header_str = '<tr><th>' . implode('</th><th>', $header) . '</th></tr>';

// montando as demais linhas da tabela
$html = '';
while($row = mysql_fetch_assoc($rs)){
	$html .= '<tr>';
	foreach($row as $key => $value){
		if($key == 'ESTADO' && is_null($value)){
			$value = 'Total Geral';
		}
		$html .= '<td>' . $value . '</td>';
	}
	$html .= '</tr>';
}


// exibindo a tabela final
echo '<table>', $header_str, $html, '</table>';

Agora, os estilos da tabela é por sua conta ;-)

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certinho! Inclusive a substituição de NULL por Total Geral. Veja o resultado:

 

p4gs.jpg

 

Muitíssimol obrigado por sua ajuda, há muito tempo estava em busca desse resultado. Onde você aprendeu tanto de php? Vou estudar seu código pra ver se consigo entender como funciona a lógica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito do que sei hoje aprendi sozinho.

Estudo PHP já tem mais de 13 anos :)

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.