Ver Mensaje Individual
  #1  
Antiguo 13-04-2015
jowil247 jowil247 is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 6
Reputación: 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