Ir para conteúdo

POWERED BY:

Arquivado

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

-rafael-

[Resolvido] count com group by

Recommended Posts

ola a todos,

 

tenho a seguinte consulta:

 

SELECT area, Count(*) AS Total
FROM campo
WHERE `setor`=1
GROUP BY area

ai tenho o seguinte resultado:

 

area -> total
1 -> 12
2 -> 18
3 -> 30
4 -> 28
5 -> 28
6 -> 29
7 -> 31
8 -> 24

serão sempre 8 areas, com valores variaveis. ate ai tudo bem.

o problema é que eventualmente pode nao haver nada em determinada area, por exemplo, na area 3, ai o retorno fica assim:

 

area -> total
1 -> 12
2 -> 18
4 -> 28
5 -> 28
6 -> 29
7 -> 31
8 -> 24

mas gostaria que fosse assim:

 

area -> total
1 -> 12
2 -> 18
3 -> 0
4 -> 28
5 -> 28
6 -> 29
7 -> 31
8 -> 24

como faço para deixar o resultado assim?

 

Banco mysql 5.1, php5, apache2.

 

espero ter sido bem claro, qualquer duvida me avisem q posto.

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

concordo com o André, até dá para fazer por SQL, mas além dele ficar meio feio talvez ainda fique pessado...

 

pelo php você poderia jogar o resultado em um array.

 

depois onde precisará desses valores podes fazer algo tipo:

 

for(.....) {
    if(!isset(array[$i])) //isset ou empty caso nao funcione corretamente
      array[$i] = 0 
}

isso assumindo que as chaves do array seriam sua primeira coluna 1 à 8...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok obrigado pela ajuda

 

outra forma q pensei seria fazer uma consulta para cada uma das areas - 1 a 8 - mas tambem tenho 8 setores, ou seja 64 consultas diferentes, e tem mais 3 padroes, dando um total de 192 consultas diferentes. ai acho q vai ferrar tudo...

 

acho q com o loop for daria certo, você teria algum exemplo de como usar?

 

obrigado pela ajuda!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php

$mysql = mysql_connect('localhost','root','') or die(mysql_error());
$db = mysql_select_db('db',$mysql) or die(mysql_error());

$sql = <<<SQL
SELECT area, Count(*) AS Total
FROM campo
WHERE `setor`=1
GROUP BY area
SQL;

$rs = mysql_query($sql) or die(mysql_error());

while(false !== ($row = mysql_fetc_assoc($rs))) $setores[$row['area']] = $row['Total'];
for($i = 1; $i < 9; $i++) if(empty($setores[$i])) $setores[$i] = 0;

var_dump($setores);

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando n retorna nada é porque n tem registro (óbvio), vai ter q ser em php msm

tipo

//considerando que as áreas sempre vão de 1 a 8 e você pesquisa 1 setor por vez
$cont = 1;
while($linha = mysql_fetch_assoc($sql) or $cont <= 8){
   if ( $linha['area'] != $cont )
       echo "<tr><td>{$cont}</td><td>0</td></tr>";
   else
       echo "<tr><td>{$linha['area']}</td><td>{$linha['total']}</td></tr>";
   $cont++;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, agradeço pela ajuda!!!

 

Evandro, talvez pela minha falta de conhecimento, nao dei conta de usar seu script... mas vou continuar tentando!

 

 

Victor Cometti, tem um problema que nao consegui solucionar de jeito nenhum: se uma linha for 0 todos os outros resultado abaixo serão 0 tbm!

 

 

veja:

 

0 - 190 
1 - 12 
2 - 4 
3 - 0 // aqui esta correto
4 - 0 // aqui era para ser 3
5 - 0 // aqui era para ser 1

agradeço a ajuda!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há um erro de lógica no código do Victor. Ele funciona normalmente até a primeira vez que a expressão lógica do if retorna true, depois disso, $linha['area'] SEMPRE terá um valor maior que $cont, e por isso o if continua avaliando como true quando era para avaliar como false.

 

Uma possível solução é a seguinte (não testei, pode não funcionar rs):

 

while( ( $linha = mysql_fetch_assoc( $sql ) ) !== false || ( $cont = 1 ) <= 8 ) {
   if ( $linha['area'] != $cont ) {
       printf( '<tr><td>%d</td><td>0</td></tr>', $cont++ );
       printf( '<tr><td>%d</td><td>%d</td></tr>', $linha[ 'area' ], $linha[ 'total' ] );
   } else {
       printf( '<tr><td>%d</td><td>%d</td></tr>', $linha[ 'area' ], $linha[ 'total' ] );
   }

   $cont++;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

é tinha um erro msm!!

a sua correção funciona!!

corrigindo

while(($linha = mysql_fetch_assoc($sql)) or $cont <= 8){
	if ( $linha['numero'] != $cont ){
		echo "<tr><td>{$cont}</td><td>0</td></tr>";
		echo "<tr><td>{$linha['area']}</td><td>{$linha['total']}</td></tr>";
		$cont++;
	}else
		echo "<tr><td>{$linha['area']}</td><td>{$linha['total']}</td></tr>";
	$cont++;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola,

 

obrigado pelas ajudas!

 

mas, descobri um pequeno detalhe nesse script: se dois resultados seguidos forem 0, ele faz uma bagunça, vejam:

 


1 - 12
2 - 4
3 - 0
6 - 3
5 - 0

o esperado era:

 

code]

 

1 - 12

2 - 4

3 - 0

4 - 0

5 - 0

6 - 3

 

[/code]

 

o que pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz uns testes ae, se num intender eh soh falar!!

$cont = 1;
while(($linha = mysql_fetch_assoc($sql)) or $cont <= 8){
   while ( $linha['area'] != $cont ){
	echo "<tr><td>{$cont}</td><td>0</td></tr>";		
	$cont++;
   }
   echo "<tr><td>{$linha['area']}</td><td>{$linha['total']}</td></tr>";
   $cont++;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

exporte a tabela e poste a estrutura aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

engraçado, testei aki e funcionou

de qlqr forma finaliza o while quando $cont for igual a 8

while(($linha = mysql_fetch_assoc($sql)) or $cont <= 8){
	while ( $linha['area'] != $cont ){
		echo "<tr><td>{$cont}</td><td>0</td></tr>";		
		if( $cont == 8 ) break;//finalizando o loop
                $cont++;
	}
	echo "<tr><td>{$linha['area']}</td><td>{$linha['total']}</td></tr>";
	$cont++;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok pessoal

 

depois de muita luta, e com a ajuda de vocês, consegui finalizar o codigo.

 

o resultado final segue abaixo:

 

 $cont = 1;
$limit = 8;
while(($linha = mysql_fetch_assoc($sql)) or $cont <= $limit){
while ( $linha['area'] != $cont ){
if( $cont > $limit ) break;
echo 'area' . "$cont" . ' - ' . "0" . "<br /> <br />";
$cont++;
}
if( $cont > $limit ) break; // necessário, pois se a última linha for 0 ele repete a sequencia abaixo, mesmo não tendo dados
echo 'area' . $linha['area'] . ' - ' . $linha['total'] . "<br /> <br />";
$cont++;
}

 

obrigado a todos!! :clap: :joia: Imagem Postada

resolvido!

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.