• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Hipnoted

Duvidas em consultas SQL

14 mensagens neste tópico

É assim, tenho um sistema de gestão de consultas de médicos a pacientes.

Simplifiquei algumas tabelas, e deu nisto:

tabelaft1.png

(tirei alguns atributos também)

Estou com dúvidas em:

1) Saber os utentes que já foram consultados por todos os médicos. Atenção ao todos, é nisto que me confundo todo.

2) Listar os utentes apenas com tratamentos inferiores a 3 dias. Mais uma vez, é o apenas a baralhar-me.

Alguém me pode dar umas dicas? É que não implementei isto num SGBD, nem estou com paciência para implementar agora e vou ter exame de melhoria sábado de manhã. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para a primeira, sugeria pegar nos utentes e médicos, eliminar repetidos, e contar os registos, efectuando um 'group by' por utente e comparar com o número de médicos. é capaz de não ser a solução mais elegante, mas deve funcionar.

deve ficar algo semelhante a isto. não sei como funcionam as precedência no SQL, talvez o WHERE não vá funcionar e tenhas que fazer mais um SELECT aninhado, mas penso que dá para perceber a ideia.

select codigoutente, count(codigomedico) as x
  from (select distinct codigoutente, codigomedico
           from consulta)
  where x = (select count(codigomedico) from medico)
  group by codigoutente

para o segundo, não estou a ver o tipo de relacionamento entre as consultas e as prescrições. não te enganaste nos atributos? está um repetido...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim enganei-me, já mudei.

Já percebi a ideia, também estou a tentar fazer da mesma forma.  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

continuo sem perceber como relacionar as tabelas... qual é a chave estrangeira? numeroconsulta?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, em vez de CodigoConsulta tinha posto NumeroConsulta...  :wallbash:

Já alterei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como nem tinha o FK, fiquei na dúvida :D

acho que o melhor é seleccionar os utentes com tratamentos superiores a três dias, e depois remover do conjunto de todos os utentes aqueles que seleccionaste anteriormente. penso que funciona...

select codigoutente
        from utente
        where codigoutente not in
                (select distinct codigoutente
                        from consulta as c, prescricao as p
                        where c.codconsulta = p.codigoconsulta
                                and p.duracao >= 3)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Implementei isto no SQL Server 2005 mas o SGBD não aceita dois atributos no DISTINCT !

Ou seja, para a 1) já posso esquecer aquela forma. É pena porque assim era fácil.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

dois atributos DISTINCT?

coloca aqui a query que usaste. acho isso estranho, pelo menos no 2000 tenho quase a certeza que funcionava.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com o DISTINCT dá, eu é que tinha tentado com o COUNT DISTINCT e dá erro:

SELECT     COUNT(DISTINCT CodigoUtente, CodigoMedico)
FROM         dbo.Consulta

Error in list of function arguments: ',' not recognized.

Unable to parse query text.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

provavelmente só mesmo com queries aninhadas...

e acho que precisas sempre de um GROUP BY para fazer um COUNT.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, no 2) acho que já me safei, pelo menos testei e deu tudo bem:

(SELECT     co.CodigoUtente
FROM         Consulta co, Prescricao p
WHERE     co.CodigoConsulta = p.CodigoConsulta AND p.Duracao < 3)
EXCEPT
(SELECT     co.CodigoUtente
FROM         Consulta co, Prescricao p
WHERE     co.CodigoConsulta = p.CodigoConsulta AND p.Duracao >= 3)

O 1) é que me está a dar cabo da cabeça...  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hipnoted, e se em vez de kereres mostrar o codigoUtente kiseres mostrar o nomeutente ???

tou c esta dificuldade...  :eek:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hipnoted, e se em vez de kereres mostrar o codigoUtente kiseres mostrar o nomeutente ???

tou c esta dificuldade...  :eek:

Hmm... Acho que é a isto que te referes:

(SELECT     u.NomeUtente
FROM         Consulta co, Prescricao p, Utente u
WHERE     co.CodigoUtente = u.CodigoUtente AND co.CodigoConsulta = p.CodigoConsulta AND p.Duracao < 3)
EXCEPT
(SELECT     co.CodigoUtente
FROM         Consulta co, Prescricao p
WHERE     co.CodigoConsulta = p.CodigoConsulta AND p.Duracao >= 3)

É só fazer mais uma junção com a tabela Utente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boax ....

como nao sei se o topico ainda esta valido....

para a 1ª

select cccc.codigoutente,u.nomeutente  from
(select ccc.codigoutente, ccc.quant from
(select cc.codigoutente ,cc.codigomedico,count(cc.codigoutente) as quant from
(SELECT c.codigoutente,c.codigomedico
  FROM consulta c
  group by c.codigoutente,c.codigomedico) as cc
group by cc.codigoutente ) as ccc) as cccc
left join utente u
on cccc.codigoutente=u.codigoutente where cccc.quant=(select count(*) from medico);

No entanto, solucao a nao utilizar  :P  as performances vao a vida em tres tempos...  :P

a solucao ideal seria passar por procedures ou funcoes...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora