Ir para conteúdo

POWERED BY:

Arquivado

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

phpricardo

Realizar cálculo médio e tirar porcentual

Recommended Posts

Sres(as),

 

Tenho o seguinte código onde preciso fazer um cálculo que pega o valor da célula e divide pela total (média) de todos, conforme nesse exemplo aqui....

 

140519052749198360.jpg

.... 


	$idservico = 0;
	$idservicoAnterior = -1;
	$totalAtendimentos = 0;
	$quantidadePessoas = 0;

	if(empty($mes) || empty($ano))
	{
		echo "<script> alert('Favor preencha todos os campos.')</script>";
	}else{
		
		if (isset($hostp))
		{
			$resulta = pg_fetch_array($consulta);
		} else {
			$resulta = $consulta->fetch_array();
		}

		while ($resulta) {

			$idservico = $resulta['id_serv'];

			if($idservico != $idservicoAnterior)
			{	
				if($idservicoAnterior != -1)
				{

					$media = round($totalAtendimentos / $quantidadePessoas);
					echo "<tr>
							<td style='width: 200px; background-color: #D3D3D3;'></td>
							<td style='background-color: #D3D3D3;'>Média</td>
							<td style='background-color: #D3D3D3;'>$media</td>
							<td style='background-color: #D3D3D3;'></td>
						  </tr>
					 	</table> <br/>";
				}

				$totalAtendimentos = 0;
				$quantidadePessoas = 0;

				echo "<table border=1>
					  <tr style='background-color: #D3D3D3;'>
						<td>Setor</td>
						<td>{$resulta['nm_serv']}</td>
						<td>Total Atendimentos</td>
						<td>Percentual x Média</td>
					  </tr>";
			}
 
                        /* AQUI SERIA +OU- PORÉM TENHO QUE DEIXAR QUE NO LUGAR NO 3
                         * ENTRE O VALOR DA MÉDIA DE CADA RESULTADO DA TABELA CONFORME 
                         * IMAGEM, SE EU COLOCAR APENAS $media NÃO DA MUITO CERTO
                         */
			$resPorcentagem = round($resulta['total'] / 3, 2);

			$totalAtendimentos += $resulta['total'];
			$quantidadePessoas += 1;
			$idservicoAnterior = $idservico;

			
			echo "<tr>
					<td>{$resulta['desc_serv']}</td>
					<td>{$resulta['nm_usu']}</td>
					<td>{$resulta['total']}</td>
					<td>{$resPorcentagem}</td>
				  </tr>";

			if (isset($hostp))
			{
				$resulta = pg_fetch_array($consulta);
			} else {
				$resulta = $consulta->fetch_array();
			}

		} // Fim while

		
		$media = @round($totalAtendimentos / $quantidadePessoas);

		if($media != 0)
		{
			echo "<tr>
					<td style='width: 200px; background-color: #D3D3D3;'></td>
					<td style='background-color: #D3D3D3;'>Média</td>
					<td style='background-color: #D3D3D3;'>$media</td>
					<td style='background-color: #D3D3D3;'></td>
				  </tr>
			 	</table> <br/>";
		}else{
			echo "<script> alert('Não existem resultados referente ao mês escolhido.') </script>";
		}

	} // Fim else tabelas


.....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como seria isso então?

A variável $resulta['total'] imprime o resultado de cada um conforme while é feito. Eu teria que pegar ela e jogar dentro do array?

Compartilhar este post


Link para o post
Compartilhar em outros sites


$x=0;//colocar antes do while

 

....

 

$matriz[$x] = $resulta['total'];

$x++;

 

...

 

//fazer um for com a quantidade

echo "<tr>";

for($i=0;$i<count($matriz);$i++)

{

echo "<td>".$matriz[$i]/$media."</td>";

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu, usando o PostgreSQL, fica beeem mais fácil fazer tudo no banco.

-- criando tabela de testes contendo
-- os nomes dos atendentes e total de atendimentos.
create temp table teste (
  nome varchar,
  atendimentos integer
);

-- inserindo registros de testes
insert into teste values ('Hugo',1),
('Carlos',2),
('João',6),
('Gustavo',11),
('Bete',3);

-- criando uma tabela temporaria com a soma total
-- de atendimentos e a media geral
create temp table tmp_pct as
select sum(atendimentos) as total_atendimentos, avg(atendimentos) as media_geral from teste;

-- consulta final contendo os dados necessarios para exibicao
select 
  a.nome,
  a.atendimentos, 
  round(t.media_geral, 2),
  t.total_atendimentos, 
  round(a.atendimentos / t.media_geral, 2) as pct_media
from teste a, tmp_pct t;

Vai resultar em:

  nome   | atendimentos | round | total_atendimentos | pct_media 
---------+--------------+-------+--------------------+-----------
 Hugo    |            1 |  4.60 |                 23 |      0.22
 Carlos  |            2 |  4.60 |                 23 |      0.43
 João    |            6 |  4.60 |                 23 |      1.30
 Gustavo |           11 |  4.60 |                 23 |      2.39
 Bete    |            3 |  4.60 |                 23 |      0.65

@braços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,
como sou fraco ainda em sql a minha está assim:

Mas vou ver o que faço.

pg_query($conn, "SELECT t3.nm_serv as desc_serv,
                                                t3.id_serv,
                                                t3.nm_serv,
                                                t1.nm_usu,
                                                count(t2.id_atend) total
                                                FROM usuarios t1
                                                INNER JOIN historico_atendimentos t2 ON t1.id_usu = t2.id_usu
                                                INNER JOIN servicos t3 ON t2.id_serv = t3.id_serv
                                                WHERE t2.dt_fim::text LIKE '%". $ano . "-" . $mes . "%'
                                        GROUP BY t3.nm_serv,   
                                                 t3.id_serv,
                                                 t3.nm_serv,
                                                 t1.nm_usu
                                        ORDER BY t3.nm_serv");

Compartilhar este post


Link para o post
Compartilhar em outros sites

joga o resultado desta consulta para uma tabela temporária chamada teste:

CREATE TEMP TABLE teste AS
SELECT t3.nm_serv as desc_serv,
        t3.id_serv,
        t3.nm_serv,
        t1.nm_usu,
        count(t2.id_atend) total
FROM usuarios t1
        INNER JOIN historico_atendimentos t2 ON t1.id_usu = t2.id_usu
        INNER JOIN servicos t3 ON t2.id_serv = t3.id_serv
        WHERE t2.dt_fim::text LIKE '%". $ano . "-" . $mes . "%'
GROUP BY t3.nm_serv,   
         t3.id_serv,
         t3.nm_serv,
         t1.nm_usu
ORDER BY t3.nm_serv;

Daeh o resto é só pegar do meu exemplo (depois dos inserts), trocando os nomes dos campos para o que você precisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sorry tempo de resposta...

 

Cara... desculpa, eu fiz isso mas está certo? É valido?

$consulta = pg_query($conn, "CREATE TEMP TABLE dados AS
                             SELECT t3.nm_serv as desc_serv,
                                    t3.id_serv,
                                    t3.nm_serv,
                                    t1.nm_usu,
                                    count(t2.id_atend) total
                                    FROM usuarios t1
                                    INNER JOIN historico_atendimentos t2 ON t1.id_usu = t2.id_usu
                                    INNER JOIN servicos t3 ON t2.id_serv = t3.id_serv
                                    WHERE t2.dt_fim::text LIKE '%". $ano . "-" . $mes . "%'
                            GROUP BY t3.nm_serv,   
                                     t3.id_serv,
                                     t3.nm_serv,
                                     t1.nm_usu
                            ORDER BY t3.nm_serv",

                            "CREATE TEMPORARY TABLE calculo as
                             SELECT sum(total) as total_atendimentos,
                                     avg(total) as media_geral
                             FROM dados",

                             "SELECT round(a.total / b.media_geral, 2) as pct_media
                              FROM dados a, calculo b"
                            );

É, eu conseguir fazer no procedimento no sgbd do postgre, mas não entendi como vou fazer isso no meu código. =(

Compartilhar este post


Link para o post
Compartilhar em outros sites

É eu conseguir fazer aqui perfeitamente no sql direto mesmo, mas pelo que vejo isso não vai render no código. #chora

Compartilhar este post


Link para o post
Compartilhar em outros sites

Executa todas juntas.

Ela vai te trazer o ultimo resultset.

$consulta = pg_query($conn, "CREATE TEMP TABLE dados AS
                             SELECT t3.nm_serv as desc_serv,
                                    t3.id_serv,
                                    t3.nm_serv,
                                    t1.nm_usu,
                                    count(t2.id_atend) total
                                    FROM usuarios t1
                                    INNER JOIN historico_atendimentos t2 ON t1.id_usu = t2.id_usu
                                    INNER JOIN servicos t3 ON t2.id_serv = t3.id_serv
                                    WHERE t2.dt_fim::text LIKE '%". $ano . "-" . $mes . "%'
                            GROUP BY t3.nm_serv,   
                                     t3.id_serv,
                                     t3.nm_serv,
                                     t1.nm_usu
                            ORDER BY t3.nm_serv;

                            CREATE TEMPORARY TABLE calculo as
                             SELECT sum(total) as total_atendimentos,
                                     avg(total) as media_geral
                             FROM dados;

                             SELECT a.*, b.*, round(a.total / b.media_geral, 2) as pct_media
                              FROM dados a, calculo b"
                            );

Compartilhar este post


Link para o post
Compartilhar em outros sites

É mano, a consulta e o resultado dela funciona bem, porém na hora do laço lá acontece a "zinca". Bem vou ter que buscar outras coisas para fazer isso melhor, mas agradeço a ajuda até aprendi mais sobre sql. :D Vlw.

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.