Count values in multiple related tables

Asked

Viewed 72 times

1

I have 4 tables tbl_Distrito, tbl_Unidade, tbl_Servidor, tbl_Processo.

tbl_Distrito: Cod_Distrito, Nome_Distrito

tbl_Unidade: Cod_Unidade, Nome_Unidade, Cod_Distrito

tbl_Servidor: Cod_Unidade

tbl_Processo: Cod_Unidade

Basically I need to list all the drives and count how many times each drive appears in the Server table and in the Process table to be able to compare these values:

My consultation:

SELECT DISTRITO.NOME_DISTRITO,
       UNIDADE.NOME_UNIDADE,
       COUNT(SERVIDOR.UNIDADE_COD_UNIDADE) AS CONTAGEM_1,
       COUNT(PROCESSO_HAS_UNIDADE.UNIDADE_COD_UNIDADE_SOLICITADA) AS CONTAGEM_2
  FROM (DISTRITO INNER
        JOIN(UNIDADE INNER JOIN PROCESSO_HAS_UNIDADE ON
             UNIDADE.COD_UNIDADE =
             PROCESSO_HAS_UNIDADE.UNIDADE_COD_UNIDADE_SOLICITADA) ON
        DISTRITO.COD_DISTRITO = UNIDADE.DISTRITO_COD_DISTRITO)
 INNER JOIN SERVIDOR
    ON UNIDADE.COD_UNIDADE = SERVIDOR.UNIDADE_COD_UNIDADE
 GROUP BY DISTRITO.NOME_DISTRITO, UNIDADE.NOME_UNIDADE;

The problem is that my query is returning equal values to CONTAGEM_1 and CONTAGEM_2.

Conforme segue a imagem

2 answers

0


I managed to solve, follows the solution for the next adventurers:

SELECT DISTRITO.NOME_DISTRITO, DERIVADA.NOME_UNIDADE, DERIVADA.TOTAL_PROCESSO, Count(SERVIDOR.UNIDADE_COD_UNIDADE) AS TOTAL_SERVIDOR
FROM DISTRITO 
INNER JOIN ((SELECT UNIDADE.DISTRITO_COD_DISTRITO, UNIDADE.COD_UNIDADE, UNIDADE.NOME_UNIDADE, COUNT(PROCESSO.UNIDADE_COD_UNIDADE) AS TOTAL_PROCESSO
FROM UNIDADE
LEFT JOIN PROCESSO
ON PROCESSO.UNIDADE_COD_UNIDADE = UNIDADE.COD_UNIDADE
GROUP BY UNIDADE.DISTRITO_COD_DISTRITO, UNIDADE.COD_UNIDADE, UNIDADE.NOME_UNIDADE) AS DERIVADA 
LEFT JOIN SERVIDOR 
ON DERIVADA.COD_UNIDADE = SERVIDOR.UNIDADE_COD_UNIDADE) 
ON DISTRITO.COD_DISTRITO = DERIVADA.DISTRITO_COD_DISTRITO
GROUP BY DISTRITO.NOME_DISTRITO, DERIVADA.NOME_UNIDADE, DERIVADA.TOTAL_PROCESSO, DERIVADA.DISTRITO_COD_DISTRITO, DERIVADA.COD_UNIDADE
HAVING (((DERIVADA.TOTAL_PROCESSO)<>0) OR ((Count(SERVIDOR.UNIDADE_COD_UNIDADE))<>0));

0

Hi,

I believe you can combine a LEFT JOIN between tbl_Unity and tbl_Service and between tbl_Unity and tbl_Process

Would look like this

select  UNIDADE.Nome_Unidade,
        DISTRITO.Nome_Distrito,
        COUNT(SERVIDOR.Cod_Unidade) AS CONTAGEM_1,
        COUNT(PROCESSO.Cod_Unidade) AS CONTAGEM_2
from    tbl_Unidade UNIDADE
left    join tbl_Servidor SERVIDOR on UNIDADE.Cod_Unidade = SERVIDOR.Cod_Unidade
left    join tbl_Processo PROCESSO on UNIDADE.Cod_Unidade = PROCESSO.Cod_Unidade
join    tbl_Distrito DISTRITO on UNIDADE.Cod_Distrito = DISTRITO..Cod_Distrito
GROUP   by UNIDADE.Nome_Unidade, DISTRITO.Nome_Distrito;
  • The idea was good but also did not work, continued to repeat the values in the two counting columns. I believe I need a sub-volume.

  • Try to do two in two tables, after you join the joins, the Left Join should bring even if you do not find the foreign key

Browser other questions tagged

You are not signed in. Login or sign up in order to post.