Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2015
jowil247 jowil247 is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 6
Poder: 0
jowil247 Va por buen camino
Mostrar consulta con última fecha de varias tablas

Hola a toda la comunidad, verán, estoy haciendo una consulta que me muestra las personas atendidas en un mes determinado, lo malo es que hay exámenes en el cual la persona atendida cuenta con diferentes "diagnósticos" es por eso que para mostrar 1 SOLO DIAGNÓSTICO pensé en mostrar aquel que cuente con la última hora y/o fecha, esto ya que en todas las tablas de donde saco el dichoso diagnóstico cuentan con una columna así: "fecha" o si no "hora".

Este es mi código actual para la consulta:

Código SQL [-]
select distinct c.fecha,
e.descripcion,
f.descripcion as 'subcontrata',
case c.idtipo when 1 then 'PRE OCUPACIONAL'
when 2 then 'PERIODICO'
when 3 then 'RETIRO'
when 4 then 'VISITA'
when 5 then 'LEVANTAMIENTO'
when 7 then 'REUBICACION' end as 'Tipo de Evaluacion',
concat(p.apellidos, ' ', p.nombres),
ar.descripcion as area,
de.descripcion as departamento,
di.descripcion as division,
pu.descripcion as puesto,
r.uni_receptor as referencia,
of.diagnostico as diagnosticoOftal1,
of.diagno2 as diagnosticoOftal2,
of.diagno3 as diagnosticoOftal3,
ot.diagnostico as Otoscopico,
au.diagnostico as Audiologia,
case od.odonto when 1 then 'SANO DENTAL'
when 2 then 'CARIES DENTAL' end as 'Odontologico',
ra.diagnostico as RayosX,
inf.espiro as Espirometria,
m.diagnostico as MusculoEsqueletico,
j.diagnostico as 'Electrocardiograma',
if (t.imc <=18.5,'BAJO PESO',

      (if(t.imc between 18.4 and 24.99, 'NORMAL',

             (if(t.imc>=30, 'OBESIDAD',
               (if (t.imc>=25, 'SOBREPESO', 'NO EXAMEN')))
          )
         )
       )

) as Nutricion,
d.diag_1 as Dermatologia,
g.impresion_diagnostica_1 as Ginecologia,
ur.impresion_diagnostica_1 as Urologia,
inf.altura as Altura,
case cond.apto when 1 then 'APTO'
when 0 then 'NO APTO'  end as 'Conduccion',
case u.sueno11 when 1 then 'BAJO RIESGO'
when 2 then 'RIESGO MEDIO'
when 3 then 'RIESGO ALTO' end as 'SAS',
h.conclu_labo as Laboratorio,
idsubcargo
from empresa e
left join comprobante c on e.idempresa=c.idempresa
left join paciente p on c.idpaciente=p.idpaciente
left join empresa f on c.idsubcontrata=f.idempresa
left join area_ocupacional ar on ar.idarea_ocupacional=c.idcargo
left join departamento_ocu de on de.iddepartamento_ocu=c.iddepartamento
left join division_ocu di on di.iddivision_ocu=c.iddivision
left join puesto pu on pu.idpuesto=c.idsubcargo
left join referencia r on r.idpaciente=p.idpaciente
left join oftalmologia of on of.idpaciente=p.idpaciente
left join eval_audiometria ot on ot.idpaciente=p.idpaciente
left join auditoria_audiologia au on au.idpaciente=p.idpaciente
left join odontologia od on od.idpaciente=p.idpaciente
left join rayosx ra on ra.idpaciente=p.idpaciente
left join ugn_deteccion u on u.idpaciente=p.idpaciente
left join informe_medico inf on inf.idpaciente=p.idpaciente
left join hc h on h.idpaciente=p.idpaciente
left join musculo m on m.idpaciente=p.idpaciente
left join clinica_dermica d on d.idpaciente=p.idpaciente
left join ginecologia g on g.idpaciente=p.idpaciente
left join urologia ur on ur.idpaciente=p.idpaciente
left join triaje t on t.idpaciente=p.idpaciente
left join conduccion_barrick2 cond on cond.idpaciente=p.idpaciente
      inner join electrocardiograma elec
  on p.idpaciente=elec.idpaciente
      inner join elec_detalle j
  on elec.idelectrocardiograma=j.idelectrocardiograma
where ('2015-01-01' <= c.fecha AND c.fecha <= '2015-01-31');

Por ejemplo en ese mes, me muestra algo de 750 resultados, pero por ejemplo, si agrego un "and p.idpaciente='2311' " al where me muestra que ese paciente cuenta con 96 filas, cuando lo correcto sería solo 1, es por eso que busqué en cada tabla de cada examen y cada uno cuenta con una columna de fecha y/o hora, porque a veces es DATE o en algunos DATE TIME, este fue el resultado de mi búsqueda:

Código SQL [-]
select uni_receptor from referencia r;      --> REFERENCIA
select diagnostico from oftalmologia of;                    --> OFTALMOLOGÍA  fecha_audita
select diagno2 from oftalmologia of;        --> OFTALMOLOGÍA2
select diagno3 from oftalmologia of;        --> OFTALMOLOGÍA3
select diagnostico from eval_audiometria ot;      --> OTOSCÓPICO    hora
select diagnostico from auditoria_audiologia au;    --> AUDIOLOGÍA    fecha_audita
select odonto from odontologia od;          --> ODONTOLOGÍA    registro_salida
select diagnostico from rayosx ra;          --> NEUMOLÓGICO    hora
select espiro from informe_medico inf;        --> ESPIROMETRÍA  fecha_audita
select diagnostico from musculo m;        --> MUSCULO ESQUELÉTICO  hora_registro
select diagnostico from elec_detalle  j;        --> ELECTROCARDIOGRAMA  fecha_audita  / electrocardiograma  fecha_audita               /
select imc from triaje t;            --> NUTRICIÓN    registro_salida
select diag_1 from clinica_dermica d;        --> DERMATOLOGÍA  
select impresion_diagnostica_1 from ginecologia g;    --> GINECOLOGÍA    fecha_audita
select impresion_diagnostica_1 from urologia ur;    --> UROLOGÍA    fecha_audita
select altura from informe_medico inf;        --> ALTURA    fecha_audita  
select apto from conduccion_barrick2 cond;      --> CONDUCCIÓN    fecha_audita
select sueno11 from ugn_deteccion u;        --> SAS      hora_registro
select conclu_labo from hc h;            --> LABORATORIO    registro_inicio

Esas son las columnas para conseguir el último resultado del diagnóstico o el resultado del que yo necesito. He visto casos parecidos al mío en esta comunidad y también en otras y he logrado hacer esto:

Código SQL [-]
select distinct c.fecha,
e.descripcion,
f.descripcion as 'subcontrata',
case c.idtipo
  when 1 then 'PRE OCUPACIONAL'
  when 2 then 'PERIODICO'
  when 3 then 'RETIRO'
  when 4 then 'VISITA'
  when 5 then 'LEVANTAMIENTO'
  when 7 then 'REUBICACION' end as 'Tipo de Evaluacion',
concat(p.apellidos, ' ', p.nombres),
ar.descripcion as area,
de.descripcion as departamento,
di.descripcion as division,
pu.descripcion as puesto,
r.uni_receptor as referencia,
of.diagnostico as diagnosticoOftal1,
of.diagno2 as diagnosticoOftal2,
of.diagno3 as diagnosticoOftal3,
ot.diagnostico as Otoscopico,
au.diagnostico as Audiologia,
case od.odonto
  when 1 then 'SANO DENTAL'
  when 2 then 'CARIES DENTAL' end as 'Odontologico',
ra.diagnostico as RayosX,
inf.espiro as Espirometria,
m.diagnostico as MusculoEsqueletico,
j.diagnostico as 'Electrocardiograma',
if (t.imc <=18.5,'BAJO PESO',

      (if(t.imc between 18.4 and 24.99, 'NORMAL',

             (if(t.imc>=30, 'OBESIDAD',
               (if (t.imc>=25, 'SOBREPESO', 'NO EXAMEN')))
          )
         )
       )

) as Nutricion,
d.diag_1 as Dermatologia,
g.impresion_diagnostica_1 as Ginecologia,
ur.impresion_diagnostica_1 as Urologia,
inf.altura as Altura,
case cond.apto
  when 1 then 'APTO'
  when 0 then 'NO APTO'  end as 'Conduccion',
case u.sueno11
  when 1 then 'BAJO RIESGO'
  when 2 then 'RIESGO MEDIO'
  when 3 then 'RIESGO ALTO' end as 'SAS',
h.conclu_labo as Laboratorio,
idsubcargo
from empresa e
left join comprobante c on e.idempresa=c.idempresa
left join paciente p on c.idpaciente=p.idpaciente
left join empresa f on c.idsubcontrata=f.idempresa
left join area_ocupacional ar on ar.idarea_ocupacional=c.idcargo
left join departamento_ocu de on de.iddepartamento_ocu=c.iddepartamento
left join division_ocu di on di.iddivision_ocu=c.iddivision
left join puesto pu on pu.idpuesto=c.idsubcargo
left join referencia r on r.idpaciente=p.idpaciente
left join oftalmologia of on of.idpaciente=p.idpaciente
left join eval_audiometria ot on ot.idpaciente=p.idpaciente
left join auditoria_audiologia au on au.idpaciente=p.idpaciente
left join odontologia od on od.idpaciente=p.idpaciente
left join rayosx ra on ra.idpaciente=p.idpaciente
left join ugn_deteccion u on u.idpaciente=p.idpaciente
left join informe_medico inf on inf.idpaciente=p.idpaciente
left join hc h on h.idpaciente=p.idpaciente
left join musculo m on m.idpaciente=p.idpaciente
left join clinica_dermica d on d.idpaciente=p.idpaciente
left join ginecologia g on g.idpaciente=p.idpaciente
left join urologia ur on ur.idpaciente=p.idpaciente
left join triaje t on t.idpaciente=p.idpaciente
left join conduccion_barrick2 cond on cond.idpaciente=p.idpaciente
      inner join electrocardiograma elec
  on p.idpaciente=elec.idpaciente
      inner join elec_detalle j
  on elec.idelectrocardiograma=j.idelectrocardiograma
where ('2015-01-01' <= c.fecha AND c.fecha <= '2015-01-31'
and of.fecha_audita=(select max(fecha_audita)from oftalmologia of where of.idpaciente='2311')
and ot.hora=(select max(hora)from eval_audiometria ot where ot.idpaciente='2311')
and au.fecha_audita=(select max(fecha_audita)from auditoria_audiologia au where au.idpaciente='2311')
and od.registro_salida=(select max(registro_salida)from odontologia od where od.idpaciente='2311')
and ra.hora=(select max(hora)from rayosx ra where ra.idpaciente='2311')
and inf.fecha_audita=(select max(fecha_audita)from informe_medico inf where inf.idpaciente='2311')
and m.hora_registro=(select max(hora_registro)from musculo m where m.idpaciente='2311')
and elec.fecha_audita=(select max(fecha_audita)from electrocardiograma elec where elec.idpaciente='2311')
and t.registro_salida=(select max(registro_salida)from triaje t where t.idpaciente='2311')
and g.fecha_audita=(select max(fecha_audita)from ginecologia g where g.idpaciente='2311')
and ur.fecha_audita=(select max(fecha_audita)from urologia ur where ur.idpaciente='2311')
and cond.fecha_audita=(select max(fecha_audita)from conduccion_barrick2 cond where cond.idpaciente='2311')
and u.hora_registro=(select max(hora_registro)from ugn_deteccion u where u.idpaciente='2311')
and h.registro_inicio=(select max(registro_inicio)from hc h where h.idpaciente='2311')
);


Solo hice eso para al menos que me muestre la fila de resultados de solo ese paciente, ya que en la consulta que tengo -la 1era que coloqué- éste paciente con este id muestra 96 filas
Espero me puedan ayudar, gracias de antemano.
Responder Con Cita
  #2  
Antiguo 13-04-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hola

En mi vida vi una consulta sql tan grande

Cita:
mostrar 1 SOLO DIAGNÓSTICO pensé en mostrar aquel que cuente con la última hora y/o fecha, esto ya que en todas las tablas de donde saco el dichoso diagnóstico cuentan con una columna así: "fecha" o si no "hora".
Y si ordenas por fecha de forma descendente, y seleccionas solo la primera fila no seria suficiente?
Responder Con Cita
  #3  
Antiguo 13-04-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
Es normal, un distinct te saca una sola fila si todos los campos son iguales.
Supongo que si un paciente ha estado varias veces, en diferentes fechas, en diferentes especialidades, aparecerá.

Yo lo que veo raro es que "mezcles" todo. Me refiero a ginecología, odontología, ofmaltologia... no sé.

Para sacar la lista de pacientes, tendrás que sacar eso, pacientes, y no mezclar con consultas, más que para saber si un paciente a estado en un periodo o no.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 13-04-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
A lo que iba,

tendrías que sacar los pacientes ( veo que tienes varias tablas de consultas )

select paciente, fecha+hora, consulta from CONSULTA1
UNION
select paciente, fecha+hora, consulta from CONSULTA2
UNION
select paciente, fecha+hora, consulta from CONSULTA3
...

y despues AGRUPAR el resultado por paciente y quedarte con el registro de fecha mayor.

select paciente, MAX(FECHA+HORA) as ULTIMACONSULTA
FROM
(
select paciente, fecha+hora, consulta from CONSULTA1
UNION
select paciente, fecha+hora, consulta from CONSULTA2
UNION
select paciente, fecha+hora, consulta from CONSULTA3
...
)

En la parte de las uniones, deberás poner las condiciones, en tu caso parece que los periodos en los que quieres saber quién ha sido atendido.

Prueba a ver si así te anda, y nos comentas.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 13-04-2015
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
Si no he entendido mal, me parece que lo que apunta AgustinOrtu serviría. Yo incluiría dichas fechas en el resultado de la select

(select first 1 of.fecha_audita from oftalmologia of where of.idpaciente=p.idpaciente order by of.fecha_audita DESC)

y me construría una vista para poder manejarlo comodamente.
__________________
http://www.gestionportable.com
Responder Con Cita
  #6  
Antiguo 20-04-2015
jowil247 jowil247 is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 6
Poder: 0
jowil247 Va por buen camino
muchas gracias a todos por responder, disculpen por no contestarles a tiempo.
logré solucionarlo todo separando en distintas consultas por cada tipo de examen y añadiendo esto:

Código SQL [-]
and t1.fecha=(select max(fecha) from tabla1 t1 where t2.idpaciente = t1.idpaciente)
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
consulta SQL varias tablas pmtzg SQL 0 02-02-2012 06:05:03
mostrar datos de varias tablas relacionadas marcos_0586 Varios 6 06-10-2010 03:35:19
Consulta con varias tablas marilinspi SQL 4 30-10-2007 22:40:48
consultar ultima fecha y ultima hora KeyMan MySQL 3 07-02-2007 16:50:25


La franja horaria es GMT +2. Ahora son las 09:54:39.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi