Fórum montar consulta com 3 tabelas #387471

28/09/2010

0

Boa tarde Amigos,   estou enfrentando a seguinte dificuldade em uma consulta, tenho 3 tabelas (TABEx_1, TABEx_2, TABMed) com a seguinte estrutura   TabEX_1 CRM Cod_TABMED Nome   TABEX_2 CRM Cod_CRM Nome   TABMED CRM CODIGO   PRECISO exibir a Soma de CRM encontrado nas Tabelas TABEX_1 e TABEX_2 e o nome que consta na TABMED.   COUNT(TABEX_1.CRM) - COUNT(TABEX_2.CRM) - TABMED.NOME           10                                        0                     FULANO             2                                        5                     BELTRANO             4                                        1                     CICLANO   Minha consulta esta assim:   select count(TABEX_1.CRM) as QTDE_1, count(TABEX_2.CRM) as QTDE_2, TABMED.NOME from TABMED left join TABEX_1 on TABMED.CRM = TABEX_1.CRM and TABEX_1.Cod_TABMED = TABMED.CODIGO  left join TABEX_2 on TABMED.CRM = TABEX_2.CRM and TABEX_2.Cod_TABMED = TABMED.CODIGO 
group by TABMED.NOME   Obrigado !!!!      
Oscar

Oscar

Responder

Posts

28/09/2010

Eriley Barbosa

E o que não ta funcionando, qual o resultado esperado explique melhor seu problema, cuidado você está com mais de uma condição no left: select count(TABEX_1.CRM) as QTDE_1, count(TABEX_2.CRM) as QTDE_2, TABMED.NOME from TABMED left join TABEX_1 on (TABMED.CRM = TABEX_1.CRM and TABEX_1.Cod_TABMED = TABMED.CODIGO)  left join TABEX_2 on (TABMED.CRM = TABEX_2.CRM and TABEX_2.Cod_TABMED = TABMED.CODIGO) 
group by TABMED.NOME
Responder

Gostei + 0

28/09/2010

Ricardo Araujo

boa tarde,


Amigo você pode monta o diagrama do banco de dados, com seus relacionamento, assim fica mais fácil fazer o SQL para você.
não estou conseguindo o relacionamento que você esta fazendo!

Responder

Gostei + 0

28/09/2010

Ricardo Araujo

ignore a mensagem anterior.

   Não estou conseguindo entender o que você precisa.
   Amigo você pode monta o diagrama do banco de dados, com seu relacionamentos, assim fica mais fácil ajuda na montagem do SQL.
 
Responder

Gostei + 0

28/09/2010

Wilson Junior

Estas suas tabelas estão meio confisas, explique melhor para poder lhe ajudar.

Aguardo retorno.
Responder

Gostei + 0

28/09/2010

Oscar

Pessoal estou com dificuldade de explicar mesmo, mas vamos lá......   Tenho 2 tabelas e preciso atraves de um periodo exibir no resultset a qtde de de vezes que o CRM é encontrado, com uma tabela eu consigo fazer a consulta perfeitamente. Segue exemplo para uma tabela apenas:   Obs. Os relacionamentos de dados entre a tabela medicos e tab1 dependem dos campos Medicos     Tab1 Codigo-----Codmedico CRM---------CRM Nome   Select count(tab1.crm), Medicos.Nome from Tab1 left join medicos on medicos.crm = tab1.crm and medicos.codigo = tab1.codmedico and tab1.data between :data1 and :data2 group by tab1.crm, medicos.nome   ai eu tenho um resultset assim:   Count_tab1   NOME    10               Fulano1      5               Fulano2    13               Fulano3   o problema entra agora, tenho tambem que exibir os dados da tab2 no mesmo resulset, os campos da tab2 sao identicos ao da tab1.   eu queria algo assim   Select count(tab1.crm),COUNT(TAB2), Medicos.Nome from Tab1 left join medicos on medicos.crm = tab1.crm and medicos.codigo = tab1.codmedico and tab1.data between :data1 and :data2 group by tab1.crm, medicos.nome  
Responder

Gostei + 0

29/09/2010

Wilson Junior

Veja se isto lhe ajuda
SELECT
  ( SELECT
      COUNT(TAB1.CRM)
    FROM
      TAB1
    WHERE
      TAB1.CRM = med.CRM
      AND TAB1.CodMedico = med.Codigo
      AND TAB1.Data BETWEEN :data1 AND :data2
  ) AS Qtde1,
  ( SELECT
      COUNT(TAB2.CRM)
    FROM
      TAB2
    WHERE
      TAB2.CRM = med.CRM
      AND TAB2.CodMedico = med.Codigo
      AND TAB2.Data BETWEEN :data1 AND :data2
  ) AS Qtde2,
  med.Nome
FROM
  MEDICOS med


Espero ter colaborado.
Responder

Gostei + 0

29/09/2010

Oscar

Maravilha Wilson, funcionou perfeitamente, agora só me da mais uma ajudinha, como faço para exibir no count apenas quando a qtde for maior que 50 (levando-se em conta que se o Tab1 for maior que 50 e o Tab2 menor deve ser exibido tb)   Abraços e Obrigado !!!
Responder

Gostei + 0

29/09/2010

Oscar

Veja se isto lhe ajuda
SELECT
  ( SELECT
      COUNT(TAB1.CRM)
    FROM
      TAB1
    WHERE
      TAB1.CRM = med.CRM
      AND TAB1.CodMedico = med.Codigo
      AND TAB1.Data BETWEEN :data1 AND :data2
  ) AS Qtde1,
  ( SELECT
      COUNT(TAB2.CRM)
    FROM
      TAB2
    WHERE
      TAB2.CRM = med.CRM
      AND TAB2.CodMedico = med.Codigo
      AND TAB2.Data BETWEEN :data1 AND :data2
  ) AS Qtde2,
  med.Nome
FROM
  MEDICOS med


Espero ter colaborado.
Funcionou Perfeitamente Wilson !!!
Responder

Gostei + 0

29/09/2010

Wilson Junior

Utilize a cláusula HAVING
HAVING
  Qtde1 > 50
  OR Qtde2 > 50


Espero ter colaborado.
Responder

Gostei + 0

29/09/2010

Oscar

Utilize a cláusula HAVING
HAVING
  Qtde1 > 50
  OR Qtde2 > 50


Espero ter colaborado.
    Onde devo colocar o Having ?

Responder

Gostei + 0

29/09/2010

Oscar

Utilize a cláusula HAVING
HAVING
  Qtde1 > 50
  OR Qtde2 > 50


Espero ter colaborado.
Wilson, tentei assim mas esta funcionando,   SELECT
  ( SELECT
      COUNT(TAB1.CRM)
    FROM
      TAB1
    WHERE
      TAB1.CRM = med.CRM
      AND TAB1.CodMedico = med.Codigo
      AND TAB1.Data BETWEEN :data1 AND :data2
  ) AS Qtde1,
  ( SELECT
      COUNT(TAB2.CRM)
    FROM
      TAB2
    WHERE
      TAB2.CRM = med.CRM
      AND TAB2.CodMedico = med.Codigo
      AND TAB2.Data BETWEEN :data1 AND :data2
  ) AS Qtde2,
  med.Nome
FROM
  MEDICOS med HAVING ((Qtde1 > 50) or (Qtde2 > 50))
Responder

Gostei + 0

29/09/2010

Wilson Junior

Se está funcioando, então está OK.
Responder

Gostei + 0

29/09/2010

Oscar

Se está funcioando, então está OK.
HEHEHEH, esqueci da palavra NÃO Wilson, não funciona o having ali
Responder

Gostei + 0

29/09/2010

Wilson Junior

Ocorre erro de sintaxe? ou o que ocorre?
Responder

Gostei + 0

29/09/2010

Oscar

Ocorre erro de sintaxe? ou o que ocorre?
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar