Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta complicada

Estas en el tema de Consulta complicada en el foro de Mysql en Foros del Web. Hola como va? bueno aca mi consulta, tengo que buscar de cada paciente los tratamientos que se hicieron en un determinado lapso de tiempo. De ...
  #1 (permalink)  
Antiguo 18/11/2009, 19:25
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 16 años, 5 meses
Puntos: 0
Consulta complicada

Hola como va?
bueno aca mi consulta, tengo que buscar de cada paciente los tratamientos que se hicieron en un determinado lapso de tiempo. De estos tratamientos necesito solo el codigo pero si un paciente tiene mas de un tratamiento necesito que esten separados por un guion, por ejemplo algo asi (0202-0905-0102-0303) y también necesito la suma de los importes de cada tratamiento del paciente. El problema es que los codigos de estos tratamientos los saco de la tabla det_registro y necesito concatenar ese mismo campo tantas veces como este en la consulta pero lo necesito en un solo renglon. Es decir, el resultado seria algo asi

PACIENTE TRATAMIENTOS TOTAL

Manuel Sosa 0101-0205-1010 $ 80



Para obtener estos datos de cada paciente sin que se repita en una sola fila puedo usar select distinct(paciente.nombre) pero no se como sumar los totales de los tratamientos ni como concatenar los codigo de estos tratamientos. Espero hacerme entender
Muchas gracias

Código SQL:
Ver original
  1. SELECT pacientes.nombre,  tratamientos.codtratamiento, tratamientos_obra.importe
  2. FROM tratamientos, pacientes, tratamientos_obra, det_registro, registro
  3. WHERE tratamientos.codtratamiento = tratamientos_obra.codtratamiento AND
  4. det_registro.codtratamiento = tratamientos.codtratamiento AND
  5. det_registro.codregistro = registro.codregistro AND
  6. registro.codpaciente = pacientes.codpaciente AND registro.fecha
  7. BETWEEN '20090101' AND '20091118'
  #2 (permalink)  
Antiguo 19/11/2009, 01:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta complicada

Agrupa por pacientes.codpaciente y usa GROUP_CONCAT():

SELECT pacientes.nombre PACIENTE, GROUP_CONCAT (tratamientos.codtratamiento SEPARATOR '-') TRATAMIENTOS, SUM(tratamientos_obra.importe) TOTAL FROM tratamientos INNER JOIN tratamientos_obra ON tratamientos.codtratamiento = tratamientos_obra.codtratamiento INNER JOIN det_registro ON det_registro.codtratamiento = tratamientos.codtratamiento INNER JOIN registro ON det_registro.codregistro = registro.codregistro INNER JOIN pacientes ON registro.codpaciente = pacientes.codpaciente WHERE registro.fecha BETWEEN '20090101' AND '20091118' GROUP BY pacientes.codpaciente

No lo he probado. Para las uniones entre tablas, usa INNER JOIN... ON. Es mejor, más rápido y deja más claro el código.
  #3 (permalink)  
Antiguo 19/11/2009, 15:32
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Consulta complicada

Muchas gracias, la consulta funciona pero el problema es que en el campo tratamiento me trae (MEMO) algo que nunca me paso y tal vez sea porque es demasiado grande el resultado pero la verdad es que variando las fechas de un dia para otro osea que por cada paciente no va a haber mas de 2 tratamientos como mucho el resultado es el mismo (MEMO). Por que pasa esto? como lo soluciono?
No sabia que era mejor usar INNER JOIN que WHERE

Le agregue unas cositas y la consulta me quedo asi

Código SQL:
Ver original
  1. SELECT obrasocial.descripcion, pacientes.nombre PACIENTE, GROUP_CONCAT(tratamientos.codtratamiento separator '-') TRATAMIENTO,
  2.  SUM(tratamientos_obra.importe) TOTAL
  3.  FROM tratamientos INNER JOIN tratamientos_obra ON tratamientos.codtratamiento = tratamientos_obra.codtratamiento
  4.  INNER JOIN det_registro ON det_registro.codtratamiento = tratamientos.codtratamiento
  5.  INNER JOIN registro ON det_registro.codregistro = registro.codregistro
  6.  INNER JOIN obrasocial ON registro.codobrasocial = obrasocial.codobra
  7.  INNER JOIN pacientes ON registro.codpaciente = pacientes.codpaciente
  8.  WHERE registro.fecha BETWEEN '20091117' AND '20091118' AND
  9.  obrasocial.codobra = 1 GROUP BY pacientes.codpaciente

Como ya dije me trae los datos bien salvo que en lugar de traerme los codigos de tratamientos asi (0101-0201-0210) me trae (MEMO)
  #4 (permalink)  
Antiguo 19/11/2009, 16:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta complicada

Es posible que el campo en cuestión esté quedando como BLOB; algo muy habitual con GROUP_CONCAT.
Una opción es hacer un CAST para recuperarlo como cadena de texto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 19/11/2009, 16:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta complicada

Como te recomienda gnzsoloyo, prueba así:
Código sql:
Ver original
  1. SELECT obrasocial.descripcion, pacientes.nombre PACIENTE, GROUP_CONCAT(CAST(tratamientos.codtratamiento AS CHAR) separator '-') TRATAMIENTO,
  2.  SUM(tratamientos_obra.importe) TOTAL
  3.  FROM tratamientos INNER JOIN tratamientos_obra ON tratamientos.codtratamiento = tratamientos_obra.codtratamiento
  4.  INNER JOIN det_registro ON det_registro.codtratamiento = tratamientos.codtratamiento
  5.  INNER JOIN registro ON det_registro.codregistro = registro.codregistro
  6.  INNER JOIN obrasocial ON registro.codobrasocial = obrasocial.codobra
  7.  INNER JOIN pacientes ON registro.codpaciente = pacientes.codpaciente
  8.  WHERE registro.fecha BETWEEN '20091117' AND '20091118' AND
  9.  obrasocial.codobra = 1 GROUP BY pacientes.codpaciente
  #6 (permalink)  
Antiguo 19/11/2009, 20:38
 
Fecha de Ingreso: noviembre-2007
Mensajes: 133
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Consulta complicada

Devuelve lo mismo, cast sirve para pasar datos binarios a cadena?
  #7 (permalink)  
Antiguo 19/11/2009, 21:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta complicada

Pruebalo así:
Código sql:
Ver original
  1. SELECT
  2.     O.descripcion,
  3.     P.nombre PACIENTE,
  4.     CAST(GROUP_CONCAT(T.codtratamiento SEPARATOR '-') AS CHAR(100))  TRATAMIENTO,
  5.     SUM(TR.importe) TOTAL
  6. FROM tratamientos T
  7.      INNER JOIN tratamientos_obra TR ON T.codtratamiento = TR.codtratamiento
  8.      INNER JOIN det_registro DR ON DR.codtratamiento = T.codtratamiento
  9.      INNER JOIN registro R ON DR.codregistro = R.codregistro
  10.      INNER JOIN obrasocial O ON R.codobrasocial = O.codobra
  11.      INNER JOIN pacientes P ON R.codpaciente = P.codpaciente
  12. WHERE
  13.        R.fecha BETWEEN '20091117' AND '20091118' AND
  14.        O.codobra = 1
  15. GROUP BY P.codpaciente;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:06.