montar consulta com 3 tabelas

Firebird

28/09/2010

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

Curtidas 0

Respostas

Eriley Barbosa

Eriley Barbosa

28/09/2010

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
GOSTEI 0
Ricardo Araujo

Ricardo Araujo

28/09/2010

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!

GOSTEI 0
Ricardo Araujo

Ricardo Araujo

28/09/2010

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.
 
GOSTEI 0
Wilson Junior

Wilson Junior

28/09/2010

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

Aguardo retorno.
GOSTEI 0
Oscar

Oscar

28/09/2010

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  
GOSTEI 0
Wilson Junior

Wilson Junior

28/09/2010

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.
GOSTEI 0
Oscar

Oscar

28/09/2010

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 !!!
GOSTEI 0
Oscar

Oscar

28/09/2010

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 !!!
GOSTEI 0
Wilson Junior

Wilson Junior

28/09/2010

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


Espero ter colaborado.
GOSTEI 0
Oscar

Oscar

28/09/2010

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


Espero ter colaborado.
    Onde devo colocar o Having ?

GOSTEI 0
Oscar

Oscar

28/09/2010

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))
GOSTEI 0
Wilson Junior

Wilson Junior

28/09/2010

Se está funcioando, então está OK.
GOSTEI 0
Oscar

Oscar

28/09/2010

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

Wilson Junior

28/09/2010

Ocorre erro de sintaxe? ou o que ocorre?
GOSTEI 0
Oscar

Oscar

28/09/2010

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).
GOSTEI 0
Wilson Junior

Wilson Junior

28/09/2010

Teste colocando assim
FROM
  MEDICOS med
GROUP BY
  med.Nome
HAVING ((Qtde1 > 50) or (Qtde2 > 50))


Espero ter colaborado.
GOSTEI 0
Oscar

Oscar

28/09/2010

Teste colocando assim
FROM
  MEDICOS med
GROUP BY
  med.Nome
HAVING ((Qtde1 > 50) or (Qtde2 > 50))


Espero ter colaborado.
Wilson, olha a Consulta real que estou usando, e continua dando erro (Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).   select
(select COUNT(*) from exames_anatomo a where a.data_finalizacao between :data1 and :data2 and
 a.crm = m.crm and a.cod_medico = m.codigo) as qtd1,
(select COUNT(*) from exames_cito c where c.data_finalizacao between :data1 and :data2 and
 c.crm = m.crm and c.cod_medico = m.codigo) as qtd2, count(m.nome),   m.nome
from medicos m
group by m.nome
Having ((qtd1 > 50) or (qtd2> 50))
order by 1,2   Att.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

28/09/2010

select * from
( select
    (  select COUNT(*) from exames_anatomo a
       where a.data_finalizacao between :data1 and :data2 and
       a.crm = m.crm and a.cod_medico = m.codigo  ) as qtd1,

    (  select COUNT(*) from exames_cito c
       where c.data_finalizacao between :data1 and :data2 and
       c.crm = m.crm and c.cod_medico = m.codigo  ) as qtd2,
    count(m.nome),
    m.nome
  from medicos m
  group by m.nome  ) tab
where tab.qtd1 > 50


funciona com subqueries a partir do FB 2.X

GOSTEI 0
Oscar

Oscar

28/09/2010

select * from
( select
    (  select COUNT(*) from exames_anatomo a
       where a.data_finalizacao between :data1 and :data2 and
       a.crm = m.crm and a.cod_medico = m.codigo  ) as qtd1,

    (  select COUNT(*) from exames_cito c
       where c.data_finalizacao between :data1 and :data2 and
       c.crm = m.crm and c.cod_medico = m.codigo  ) as qtd2,
    count(m.nome),
    m.nome
  from medicos m
  group by m.nome  ) tab
where tab.qtd1 > 50


funciona com subqueries a partir do FB 2.X

Xiiiiiii, então não terá jeito mesmo, eu uso o 1.5
GOSTEI 0
Wilson Junior

Wilson Junior

28/09/2010

Até tem como, mas ficará mais pesado. Voê terá que por o mesmo Subselect na claúsula WHERE e verificar se a sua qtde é mairo do que 50.

Espero ter colaborado.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

28/09/2010

tente:

select
  count(a.crm) as qtd1,

  (  select COUNT(*) from exames_cito c
     where c.data_finalizacao between :data1 and :data2 and
     c.crm = m.crm and c.cod_medico = m.codigo  ) as qtd2,

  count(m.nome),

  m.nome
from
  medicos m

left join exames_anatomo a on
  a.data_finalizacao between :data1 and :data2 and
  a.crm = m.crm and a.cod_medico = m.codigo

group by
  m.nome

having
  count(a.crm) > 50


creio que assim funcione.


GOSTEI 0
Oscar

Oscar

28/09/2010

tente:

select
  count(a.crm) as qtd1,

  (  select COUNT(*) from exames_cito c
     where c.data_finalizacao between :data1 and :data2 and
     c.crm = m.crm and c.cod_medico = m.codigo  ) as qtd2,

  count(m.nome),

  m.nome
from
  medicos m

left join exames_anatomo a on
  a.data_finalizacao between :data1 and :data2 and
  a.crm = m.crm and a.cod_medico = m.codigo

group by
  m.nome

having
  count(a.crm) > 50


creio que assim funcione.


Muito Obrigado pela força mas continua com o mesmo erro relatado acima.   Att.   Oscar
GOSTEI 0
Bruno Batista

Bruno Batista

28/09/2010

Boa tarde,

acho que desta maneira deve funcionar.

select t1.Quant as QTDE_1, 
       T2.Quant as QTDE_2, 
       TABMED.NOME 
  from TABMED
  left join (Select Ta1.Crm,
                    Ta1.Cod_TABMED,
                    Count(1) As Quant
               From TABEX_1 Ta1,
              Group by Ta1.Crm,
                       Ta1.Cod_TabMed) T1 on (TABMED.CRM = T1.CRM and TABMED.CODIGO = T1.Cod_TABMED)
  left join (Select Ta2.Crm,
                    Ta2.Cod_TabMed,
                    Count(1) As Quant
               From TABEX_2 Ta2
              Group by Ta2.Crm,
                       Ta2.Cod_TabMed) T2 on (TABMED.CRM = T2.CRM and TABMED.CODIGO = T2.Cod_TABMED)
 order by TABMED.NOME 


tente:

select
  count(a.crm) as qtd1,

  (  select COUNT(*) from exames_cito c
     where c.data_finalizacao between :data1 and :data2 and
     c.crm = m.crm and c.cod_medico = m.codigo  ) as qtd2,

  count(m.nome),

  m.nome
from
  medicos m

left join exames_anatomo a on
  a.data_finalizacao between :data1 and :data2 and
  a.crm = m.crm and a.cod_medico = m.codigo

group by
  m.nome

having
  count(a.crm) > 50


creio que assim funcione.


Muito Obrigado pela força mas continua com o mesmo erro relatado acima.   Att.   Oscar
GOSTEI 0
Bruno Batista

Bruno Batista

28/09/2010

Boa tarde,

para funcionar somente com 50.

select t1.Quant as QTDE_1, 
       T2.Quant as QTDE_2, 
       TABMED.NOME 
  from TABMED
  left join (Select Ta1.Crm,
                    Ta1.Cod_TABMED,
                    Count(1) As Quant
               From TABEX_1 Ta1,
              Group by Ta1.Crm,
                       Ta1.Cod_TabMed) T1 on (TABMED.CRM = T1.CRM and TABMED.CODIGO = T1.Cod_TABMED)
  left join (Select Ta2.Crm,
                    Ta2.Cod_TabMed,
                    Count(1) As Quant
               From TABEX_2 Ta2
              Group by Ta2.Crm,
                       Ta2.Cod_TabMed) T2 on (TABMED.CRM = T2.CRM and TABMED.CODIGO = T2.Cod_TABMED)
 Where T1.Quant > 50 
      OR T2.Quant > 50
 order by TABMED.NOME 


Boa tarde,

acho que desta maneira deve funcionar.

select t1.Quant as QTDE_1, 
       T2.Quant as QTDE_2, 
       TABMED.NOME 
  from TABMED
  left join (Select Ta1.Crm,
                    Ta1.Cod_TABMED,
                    Count(1) As Quant
               From TABEX_1 Ta1,
              Group by Ta1.Crm,
                       Ta1.Cod_TabMed) T1 on (TABMED.CRM = T1.CRM and TABMED.CODIGO = T1.Cod_TABMED)
  left join (Select Ta2.Crm,
                    Ta2.Cod_TabMed,
                    Count(1) As Quant
               From TABEX_2 Ta2
              Group by Ta2.Crm,
                       Ta2.Cod_TabMed) T2 on (TABMED.CRM = T2.CRM and TABMED.CODIGO = T2.Cod_TABMED)
 order by TABMED.NOME 


tente:

select
  count(a.crm) as qtd1,

  (  select COUNT(*) from exames_cito c
     where c.data_finalizacao between :data1 and :data2 and
     c.crm = m.crm and c.cod_medico = m.codigo  ) as qtd2,

  count(m.nome),

  m.nome
from
  medicos m

left join exames_anatomo a on
  a.data_finalizacao between :data1 and :data2 and
  a.crm = m.crm and a.cod_medico = m.codigo

group by
  m.nome

having
  count(a.crm) > 50


creio que assim funcione.


Muito Obrigado pela força mas continua com o mesmo erro relatado acima.   Att.   Oscar
GOSTEI 0
Oscar

Oscar

28/09/2010

Bom pessoal, agradeço muito pela ajuda oferecida. A Solução final foi utilizar filtros do quickreport usando o bom e velho Delphi, ai consegui exibir da forma que precisava.   Att.   Oscar Luiz
GOSTEI 0
POSTAR