Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Consulta avançada

Boa tarde, primeiramente parabéns pelo conteudo, muito claro e tem me ajudado bastante.

Desenvolvendo alguns projetos, cheguei em um problema que com meu atual nivel de conhecimento e pouca maturidade nao consegui resolver apenas com sql, queria uma ajuda... Tenho a seguinte tabela: [producao], com os seguintes campos: id - data - equipe - supervisor - meta - produzido

Para cada mes tenho a informação do produzido da equipe.... ex de dados:

1; 2018-01-01; Equipe A; Yago; 100; 125 2; 2018-01-01; Equipe B; Yago; 110; 105 3; 2018-01-01; Equipe C; Augusto; 120; 105

4; 2018-02-01; Equipe A; Yago; 100; 105 5; 2018-02-01; Equipe B; Yago; 110; 155 6; 2018-02-01; Equipe C; Augusto; 120; 165

Para cada mês eu tenho que saber em percentual quantas equipes cada supervisor tem dentro da meta, e mostrar em ordem decrescente de acordo c a porc. o supervisor, o total de meta de suas equipes o produzido total e a diferença entre produzido e meta.

Ex, para 2018-01-01 ( a data que foi buscado) eu teria:

supervisor - Equipes na meta - meta - produzido - diferenca

Yago - 50% - 210 - 230 - 20

Augusto - 0% - 120 - 105 - -15


Como eu tou fazendo hoje: faço um distinct pra pegar cada supervisor ( ja que supervisor aparece varias vezes, tendo em vista que ele tem varias equipes ) e depois faço um outro select tendo com filtro esse supervisor(tenho uma consulta dentro do primeiro while )kkk, e eu tenho uma variavel que conta o numero total de equipes desse supervisor, quantas ficaram dentro da meta ou fora, e vou fazendo esse calculo e colocando dentor de um array, depois organizo esse array e vou mostrando item a item, estou usando PHP...

Ta um pouco lenta a pagina, acho que se fizesse isso no sql seria bem mais rapido.... sendo q , o supervisor e a equipe tenho apenas o id dela, pego seus respectivos nomes de outra tabela ...

alguma idéia ? pelo menos entenderam minha duvida ? kkk obg desde ja

2 respostas
solução!

Tem várias formas de tentar resolver isso. A forma mais fácil seria você criar uma tabela temporária consolidando o mês, e depois, sobre esta tabela, fazer os cálculos.

A outra forma seria fazer uma consulta dentro da outra.

Considerando a forma mais fácil, e a estrutura da tabela que você informou, eu recomendaria criar uma tabela com o resultado desta consulta:

SELECT year(data) as ano, month(data) as mes, supervisor, equipe, 
sum(meta) as total_meta, sum(produzido) as total_realizado, 
CASE WHEN sum(produzido) >= meta THEN 1 else 0 end as marcador_meta,
from producao group by year(data), month(data)
GROUP BY year(data) as ano, month(data) as mes, supervisor, equipe

Por exemplo, se você gravar os resultados desta consulta como "consolidado_producao", você pode, sobre esta tabela, fazer a seguinte consulta:

SELECT ano, mes, supervisor, count(*) as total_equipes, 
sum(marcador_meta) as bateram_meta, 
sum(total_meta) as total_meta, sum(total_realizado) as realizado, sum(total_realizado) -  sum(total_meta) as diferenca
from consolidado_producao
WHERE ano = 2018 and mes = 2
group by  ano, mes, supervisor

Faltaria fazer o cálculo da porcentagem com base nas equipes que bateram meta. Por isso que na tabela consolidada eu criei um campo auxiliar que marca 1 para bateu meta e 0 para não bateu

No caso eu poderia criar uma View dentro do meu banco de dados com o resultado da consulta né isso ? show de bola, vou tentar. Obrigado