Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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....
/applications/core/interface/imageproxy/imageproxy.php?img=http://nsae01.casimages.net/img/2014/05/19/140519052749198360.jpg&key=9bcfbb08970820edb8c322ac825ee63d22a21c90127cf635ff6b36b8689d7b66" alt="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
.....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?
$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>";
}Não funcionou como esperado, =( o problema é a variável $media.
Tente fazer a Média direto, ou numa consulta separada.
SELECT ROUND(AVG(total),0) as total FROM nome_da_tabela
Esse fica sendo somente a média.
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!
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");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) totalDaeh o resto é só pegar do meu exemplo (depois dos inserts), trocando os nomes dos campos para o que você precisa.
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. =(
É eu conseguir fazer aqui perfeitamente no sql direto mesmo, mas pelo que vejo isso não vai render no código. #chora
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"
);É 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.
Você vai ter que guardar num array o resultado de cada celula da coluna total de atendimento.