montar consulta com 3 tabelas
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 !!!!
group by TABMED.NOME Obrigado !!!!
Oscar
Curtidas 0
Respostas
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
group by TABMED.NOME
GOSTEI 0
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!
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
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.
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
28/09/2010
Estas suas tabelas estão meio confisas, explique melhor para poder lhe ajudar.
Aguardo retorno.
Aguardo retorno.
GOSTEI 0
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
28/09/2010
Veja se isto lhe ajuda
Espero ter colaborado.
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
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
28/09/2010
Veja se isto lhe ajuda
Espero ter colaborado.
Funcionou Perfeitamente Wilson !!!
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
Wilson Junior
28/09/2010
Utilize a cláusula HAVING
Espero ter colaborado.
HAVING Qtde1 > 50 OR Qtde2 > 50
Espero ter colaborado.
GOSTEI 0
Oscar
28/09/2010
Utilize a cláusula HAVING
Espero ter colaborado.
Onde devo colocar o Having ?HAVING Qtde1 > 50 OR Qtde2 > 50
Espero ter colaborado.
GOSTEI 0
Oscar
28/09/2010
Utilize a cláusula HAVING
Espero ter colaborado.
Wilson, tentei assim mas esta funcionando,
SELECTHAVING Qtde1 > 50 OR Qtde2 > 50
Espero ter colaborado.
( 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
28/09/2010
Se está funcioando, então está OK.
GOSTEI 0
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
28/09/2010
Ocorre erro de sintaxe? ou o que ocorre?
GOSTEI 0
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
28/09/2010
Teste colocando assim
Espero ter colaborado.
FROM MEDICOS med GROUP BY med.Nome HAVING ((Qtde1 > 50) or (Qtde2 > 50))
Espero ter colaborado.
GOSTEI 0
Oscar
28/09/2010
Teste colocando assim
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
FROM MEDICOS med GROUP BY med.Nome HAVING ((Qtde1 > 50) or (Qtde2 > 50))
Espero ter colaborado.
(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
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
( 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
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
( 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
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.
Espero ter colaborado.
GOSTEI 0
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.
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
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
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
Bruno Batista
28/09/2010
Boa tarde,
acho que desta maneira deve funcionar.
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.
Oscarselect
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
Bruno Batista
28/09/2010
Boa tarde,
para funcionar somente com 50.
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.
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.
Oscarselect
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
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