Ir para conteúdo
Fórum Script Brasil
  • 0

Somatório com MySQL e PHP


devdenis

Pergunta

Boa Noite a todos.

Meu código precisa fazer um somatório, mais está somando apenas quando o valor='8'.
valor='4' está retornando a mesma soma de valor='8'
EXEMPLO: Temos as tabelas linhas e passageiros.
1.gif
Código para somatório:
Sendo
8= inteiros
4= meios
	 <?php
		  $sql_sum = "SELECT linhas.id, 
		  SUM(passageiro.mensalidade='8') AS inteiros_conv,
		  SUM(passageiro.mensalidade) AS num_inteiros_conv,
		  SUM(passageiro.mensalidade='4') AS meios_conv,
		  SUM(passageiro.mensalidade) AS num_meios_conv
		  FROM passageiro, linhas WHERE (passageiro.situacao='AT' OR passageiro.situacao='CO')
		  AND passageiro.linha_ida=linhas.id AND passageiro.linha_volta=linhas.id  GROUP BY linhas.id";

		$consulta_sumario = mysql_query($sql_sum);

		echo '<center><table class="table_relatorio_seguro">
		      <div class="vermelho" style="text-transform:uppercase;"> Relatório de Cálculo Sumário<br /><br /></div>';
		echo '<tr class="table_relatorio_seguro">';
        echo '<td class="vermelho"  ><center>Linha</center></td>';
		echo '<td class="vermelho"  ><center>Inteiros Conv</center></td>';
		echo '<td class="vermelho"  ><center>Num Inteiros Conv.</center></td>';
		echo '<td class="vermelho"  ><center>Meios Conv</center></td>'; 
		echo '<td class="vermelho"  ><center>Num Meios Conv</center></td>';
		echo '</tr>';

		while($registro_sum = mysql_fetch_assoc($consulta_sumario)){
		 
		echo '<tr class="table_relatorio_seguro">';
		echo '<td><center>'.$registro_sum["id"].'</center></td>';
		echo '<td><center>'.$registro_sum["inteiros_conv"].'</center></td>';
		echo '<td><center>'.$registro_sum["num_inteiros_conv"].'</center></td>';
		echo '<td><center>'.$registro_sum["meios_conv"].'</center></td>';
		echo '<td><center>'.$registro_sum["num_meios_conv"].'</center></td>';
		echo '</tr>';
		}
		echo '</table></center>';
		
		?>
Os INTEIROS CONV e os NUM INTEIROS CONV estão corretos.
Já os MEIOS CONV estão resultando 'zero' e os NUM MEIOS CONV estão repetindo
a soma com valor='8' e não com valor='4'.
RESULTADO QUE ESTOU OBTENDO:
2.gif
Agradeço desde já qualquer ajuda pois está complicado!
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

faça assim:

select linha, sum(if(mensalidade=8,1,0)) as qt_inteiros, sum(if(mensalidade=8, mensalidade,0)) as soma_inteiros,
sum(if(mensalidade=4,1,0)) as qt_meios, sum(if(mensalidade=4, mensalidade,0)) as soma_meios
from minhatabela
group by linha
Link para o comentário
Compartilhar em outros sites

  • 0
Obrigado pela resposta Denis, e belo nome rs !
Bom eu adaptei o seu exemplo e funcionou, mais ainda não consegui todos resultados.
Dessa maneira esta somando corretamente apenas os MEIOS, ou seja, mensalidade=4:
 $sql_sum = "SELECT linhas.id, SUM(if(mensalidade=8,1,0))  as qt_inteiros, SUM(if(mensalidade=8, mensalidade,0)) 
 as soma_inteiros, sum(if(mensalidade=4,1,0)) as qt_meios, SUM(if(mensalidade=4, mensalidade,0)) as soma_meios
 FROM passageiro, linhas WHERE(passageiro.situacao='AT' OR passageiro.situacao='CO')
 AND passageiro.linha_ida=linhas.id GROUP BY linhas.id";

RESULTADO:

meios.gif

E acrescentando passageiro.linha_volta=linhas.id antes de GROUP BY está somando corretamento apenas os INTEIROS, ou seja, mensalidade=8, e zerando os meios.

 $sql_sum = "SELECT linhas.id, linhas.situacao, SUM(if(mensalidade=8,1,0))  as qt_inteiros, SUM(if(mensalidade=8, mensalidade,0)) 
 as soma_inteiros, sum(if(mensalidade=4,1,0)) as qt_meios, SUM(if(mensalidade=4, mensalidade,0)) as soma_meios
 FROM passageiro, linhas WHERE(passageiro.situacao='AT' OR passageiro.situacao='CO')
 AND passageiro.linha_ida=linhas.id AND passageiro.linha_volta=linhas.id  GROUP BY linhas.id";

RESULTADO:

inteiros.gif

O que faz este 8,1,0 cria uma espécie de ponteiro que zera o resultado na query para próxima soma?
Estou tentando vendo se consigo ajustar.
Obrigado pela ajuda e se alguém tiver mais alguma solução agradeço.

Link para o comentário
Compartilhar em outros sites

  • 0

sum(if(mensalidade=4,1,0))

Lêia-se da seguinte forma: Conte 1 se mensalidade = 0; Se não for igual a 4, então não conte

Como há uma comparação em if(mensalidade=4,1,0) deve-se usar o SUM e não o COUNT. O COUNT contaria todos.

O SUM também SOMA todos mas devido o condicional IF, quando retorna verdadeiro soma 1 e quando retorna falso soma 0

Link para o comentário
Compartilhar em outros sites

  • 0

poxa Denis consegui... você é o cara, me ajudou bastante seu exemplo..

agora tá somando os meios e os inteiros certinho.. eu apenas subtrai os resultados que eram = 'NT'.

Está trazendo bastante resultado mais não estou conseguindo somar a qt_total, ou seja, mensalidade =8 + mensalidade=4 . (TOTAL RECEITA) parece estar somando apenas mensalidade=8.

Estou tentando assim sem êxito:

 $sql_sum = "
SELECT linhas.id, 
       SUM(IF(passageiro.mensalidade=8,1,0) - (passageiro.linha_ida='NT'
                                               OR passageiro.linha_volta='NT')) AS qt_inteiros, 
       SUM(IF(passageiro.mensalidade=8, passageiro.mensalidade,0)) AS soma_inteiros, 
       SUM(IF(passageiro.mensalidade=4,1,0)) AS qt_meios, 
       SUM(IF(passageiro.mensalidade=4, passageiro.mensalidade,0)) AS soma_meios, 
       SUM(IF(passageiro.mensalidade=4,1,0) + (passageiro.linha_ida='NT' | passageiro.linha_volta='NT')) AS qt_nao_conv_meios, 
       SUM(IF(passageiro.mensalidade=4,1,0) + (passageiro.linha_volta='NT')) AS qt_nao_conv_ida_meios, 
       SUM(IF(passageiro.mensalidade=8,1,0) + (passageiro.linha_ida='NT'
                                               OR passageiro.linha_volta='NT')) AS qt_total_pagantes, 
       SUM(IF(passageiro.mensalidade=8, passageiro.mensalidade,0) && passageiro.mensalidade=4, passageiro.mensalidade,0) ) AS qt_total
FROM passageiro, 
     linhas WHERE(passageiro.situacao='AT'
                  OR passageiro.situacao='CO') 
AND passageiro.linha_ida=linhas.id
GROUP BY linhas.id";

RESULTADO:

3.gif

sabe como posso somar essa qt_total?

Link para o comentário
Compartilhar em outros sites

  • 0

Faça assim:

SELECT linhas.id,
SUM(IF(passageiro.mensalidade=8,1,0) - (passageiro.linha_ida='NT'
OR passageiro.linha_volta='NT')) AS qt_inteiros,
SUM(IF(passageiro.mensalidade=8, passageiro.mensalidade,0)) AS soma_inteiros,
SUM(IF(passageiro.mensalidade=4,1,0)) AS qt_meios,
SUM(IF(passageiro.mensalidade=4, passageiro.mensalidade,0)) AS soma_meios,
SUM(IF(passageiro.mensalidade=4,1,0) + (passageiro.linha_ida='NT' | passageiro.linha_volta='NT')) AS qt_nao_conv_meios,
SUM(IF(passageiro.mensalidade=4,1,0) + (passageiro.linha_volta='NT')) AS qt_nao_conv_ida_meios,
SUM(IF(passageiro.mensalidade=8,1,0) + (passageiro.linha_ida='NT'
OR passageiro.linha_volta='NT')) AS qt_total_pagantes,
SUM(IF(passageiro.mensalidade=8, passageiro.mensalidade,0) && passageiro.mensalidade=4, passageiro.mensalidade,0) ) AS qt_total
FROM passageiro,
linhas WHERE(passageiro.situacao='AT'
OR passageiro.situacao='CO')
AND passageiro.linha_ida=linhas.id
GROUP BY linhas.id
UNION
SELECT linhas.id,
SUM(IF(passageiro.mensalidade=8,1,0) - (passageiro.linha_ida='NT'
OR passageiro.linha_volta='NT')) AS qt_inteiros,
SUM(IF(passageiro.mensalidade=8, passageiro.mensalidade,0)) AS soma_inteiros,
SUM(IF(passageiro.mensalidade=4,1,0)) AS qt_meios,
SUM(IF(passageiro.mensalidade=4, passageiro.mensalidade,0)) AS soma_meios,
SUM(IF(passageiro.mensalidade=4,1,0) + (passageiro.linha_ida='NT' | passageiro.linha_volta='NT')) AS qt_nao_conv_meios,
SUM(IF(passageiro.mensalidade=4,1,0) + (passageiro.linha_volta='NT')) AS qt_nao_conv_ida_meios,
SUM(IF(passageiro.mensalidade=8,1,0) + (passageiro.linha_ida='NT'
OR passageiro.linha_volta='NT')) AS qt_total_pagantes,
SUM(IF(passageiro.mensalidade=8, passageiro.mensalidade,0) && passageiro.mensalidade=4, passageiro.mensalidade,0) ) AS qt_total
FROM passageiro,
linhas WHERE(passageiro.situacao='AT'
OR passageiro.situacao='CO')
AND passageiro.linha_ida=linhas.id

Não testei a logica, mas é por este caminho.

Teste o select após o UNION

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...