Ir para conteúdo

POWERED BY:

Arquivado

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

brunosardao

Consulta entre duas tabelas

Recommended Posts

Pessoal,

boa tarde

 

Eu tenho duas tabelas: TB_DEMANDA e TB_DADOS_PROJETO .

 

a TB_DEMANDA possui uma foreing key com a TB_DADOS_PROJETO através do campo cod_proj_id.

 

Os campos estão assim:

 

TB_DADOS_PROJETO

id | nome_projeto

 

TB_DEMANDA

id | cod_proj_id | num_demanda | status.

 

Eu preciso fazer o seguinte relatorio:

 

Nome do Projeto | Qtd de Demandas Geradas | Qtd de Demandas atendidas | demandas Pendentes | Porcentagem de atendimento.

 

Será que vocês poderiam me ajudar com esta query ou estas querys ?

 

Muito Obrigado.

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui contar desta forma:

 

"SELECT tb_demanda.*, count(cod_proj_id) as Geradas
FROM tb_demanda left join tb_dados_projeto on tb_demanda.cod_proj_id = tb_dados_projeto.id
GROUP BY tb_dados_projeto.id") OR DIE(mysql_error());
Para informar o valor de cada projeto em um formulário, eu utilizo o alias Geradas que eu coloquei ou não ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na realidade, funcionou legal. desta forma:

 

SELECT tb_dados_projeto.*,tb_demanda.*, count(cod_proj_id) as Geradas
FROM tb_demanda left join tb_dados_projeto on
tb_demanda.cod_proj_id = tb_dados_projeto.id
GROUP BY tb_dados_projeto.id") OR DIE(mysql_error());
Capturei os valores pelo Alias, agora, além disso, precisaria contar a quantidade de atendidos, que será baseado no campo status.
Como posso fazer mais uma contagem no meio deste meu código ?
Poderiam ajudar ?
Obrigado,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilizando um IF dentro do COUNT().

 

Sabendo que a função COUNT conta todos os campos não nulos, basta identifica-los dentro do COUNT.

SELECT cod_proj_id, COUNT( IF( status = 'finalizado', 1, NULL ) ) as qtd_atendidos
FROM tb_demanda

Compartilhar este post


Link para o post
Compartilhar em outros sites

evoluindo a ideia do lokaodomau

 

SELECT cod_proj_id,
               COUNT( IF( status = 'finalizado', 1   , NULL ) ) as qtd_atendidos,
               COUNT( IF( status = 'finalizado', NULL, 1    ) ) as qtd_nao_atendidos,
               count(*)                                            qtd_total
        FROM tb_demanda
        

        select cod_proj_id, round((qtd_atendidos/qtd_total),20 perc_atendidas
        from
        (
         SELECT cod_proj_id,
               COUNT( IF( status = 'finalizado', 1   , NULL ) ) as qtd_atendidos,
               COUNT( IF( status = 'finalizado', NULL, 1    ) ) as qtd_nao_atendidos,
               count(*)                                            qtd_total
        FROM tb_demanda
        ) virtual

Compartilhar este post


Link para o post
Compartilhar em outros sites

lokaodomau muito obrigado.

 

Motta,

 

Eu executei o seu primeiro código e funcionou direitinho...

 

Agora, na execução do segundo gerou o erro abaixo:

 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from
(
SELECT cod_proj_id,
COUNT( IF( status = '' at line 2

 

O que acontece ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz um teste aqui e fiz o seguinte:

 

SELECT tb_dados_projeto.*,tb_demanda.*,
COUNT(cod_proj_id) as Geradas,
COUNT( IF(tb_demanda.status = 'Concluido',1, null)) as qtd_atendidos,
COUNT( IF(tb_demanda.status = 'Em andamento', 1, Null)) as qtd_nao_atendidos
FROM tb_demanda left join tb_dados_projeto on tb_demanda.cod_proj_id = tb_dados_projeto.id
GROUP BY tb_dados_projeto.id
Pois, preciso contar as demandas relacionadas a cada projeto, mas fazendo desta forma ainda não conta.
Poderiam me ajudar a corrigir este código e nele mesmo adaptar aquela porcentagem que você mostrou motta ?
mais uma vez obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

[...]

        select cod_proj_id, round((qtd_atendidos/qtd_total),20 perc_atendidas
        from
        (
         SELECT cod_proj_id,
               COUNT( IF( status = 'finalizado', 1   , NULL ) ) as qtd_atendidos,
               COUNT( IF( status = 'finalizado', NULL, 1    ) ) as qtd_nao_atendidos,
               count(*)                                            qtd_total
        FROM tb_demanda
        ) virtual

 

Troca o zero por ")":

select cod_proj_id, round((qtd_atendidos/qtd_total),2) perc_atendidas
from
(
  SELECT cod_proj_id,
    COUNT( IF( status = 'finalizado', 1   , NULL ) ) as qtd_atendidos,
    COUNT( IF( status = 'finalizado', NULL, 1    ) ) as qtd_nao_atendidos,
    count(*)                                            qtd_total
  FROM tb_demanda
) virtual

Motta, achei muito interessante a forma de tratar os não finalizados, muito bom! Bom e simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

 

Colocando o comando abaixo, sem o ROUND, funciona diretinho, mas com o ROUND ocorre a mensagem:

 

#1054 - Unknown column 'qtd_atendidos' in 'field list'

 

Como posso solucionar isso ?

 

SELECT tb_dados_projeto.*,tb_demanda.*,
COUNT( cod_proj_id ) as Total_geradas,
COUNT( IF( tb_demanda.status = 2, 1, NULL ) ) as qtd_atendidos,
COUNT( IF( tb_demanda.status = 2, NULL, 1 ) ) as qtd_nao_atendidos,
ROUND((qtd_atendidos/Total_geradas),2) as perc_atendidas
FROM tb_demanda LEFT JOIN tb_dados_projeto ON tb_demanda.cod_proj_id = tb_dados_projeto.id
GROUP BY tb_dados_projeto.id;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se fizer da forma que o Motta disse, funciona, tem que criar uma tabela virtual, pra facilitar a estruturação do relatório, da forma que fez, funcionaria com variáveis, mas ainda não entendo muito bem das variáveis no DB.

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.