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

Simple LEFT JOIN no Funciona

Estas en el tema de Simple LEFT JOIN no Funciona en el foro de Mysql en Foros del Web. Buenas tardes amigos para explicar mi problema les comentare las tablas que tengo: tengo 3 tablas sol_serv cliente_cod,paciente_cod,articulo_cod,monto clientes cliente_cod,cliente,cliente_tipo servicios articulo_cod,articulo,depart En la tabla ...
  #1 (permalink)  
Antiguo 08/04/2015, 10:45
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 9 meses
Puntos: 19
Simple LEFT JOIN no Funciona

Buenas tardes amigos para explicar mi problema les comentare las tablas que tengo:
tengo 3 tablas

sol_serv
cliente_cod,paciente_cod,articulo_cod,monto

clientes
cliente_cod,cliente,cliente_tipo

servicios
articulo_cod,articulo,depart

En la tabla clientes tengo una lista parcial de los clientes donde en el tipo tengo datos como (EMPRESA,PDVSA,FUNDACION,SEGUROS) asumiendo que el cliente que no este en esa tabla es un cliente particular. (esto es porque la bd original es oracle y hago un dump de lo que necesito)

entonces ya he hecho un query donde obtengo todo el monto en bsf de lo que me consumieron los seguros así:
Código MySQL:
Ver original
  1. SELECT SUM(sol.monto)as monto, COUNT(s.dep) as cuenta, COUNT(DISTINCT sol.paciente) as pacientes FROM solc_servicios sol INNER JOIN sadmint_clientes c ON sol.cliente=c.cod_resp INNER JOIN sadmint_servicios s ON sol.articulo=s.cod_serv WHERE YEAR(sol.fecha)=$year AND MONTH(sol.fecha)=$month AND s.dep='LAB' AND C.TIPO='SEGUROS'

repitiéndolo para los otros clientes...

Ahora busco el monto de los clientes Particulares, que no es mas que un LEFT JOIN (datos que aparecen en sol_serv pero no en clientes)

Código MySQL:
Ver original
  1. SUM(sol.monto) as monto,
  2. COUNT(s.dep) as cuenta,
  3. COUNT(DISTINCT sol.paciente) as pacientes
  4. FROM solc_servicios sol
  5. LEFT JOIN sadmint_clientes c
  6. ON sol.cliente=c.cod_resp
  7. INNER JOIN sadmint_servicios s
  8. ON sol.articulo=s.cod_serv
  9. YEAR(sol.fecha)=2015
  10. MONTH(sol.fecha)=02
  11. AND s.dep='BANCO DE SANGRE' AND C.TIPO NOT IN ('SEGUROS','EMPRESAS','PDVSA','FUNDACION')

Pero me trae NULL, pruebo en vez de SUMAR y CONTAR, listar y salen todos los NULLS que son los montos que pretendo sumar y contar.

Entonces como obtengo el valor que busco? porque el MINUS que es un JOIN que puede servirme no lo soporta MySQL...
  #2 (permalink)  
Antiguo 09/04/2015, 07:56
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Simple LEFT JOIN no Funciona

Hola JuJoGuAl:

No me queda claro qué es lo que esperas obtener como salida, postea algunos datos de ejemplo de cada una de las tablas y dinos a partir de esos datos qué es lo que esperas obtener como salida, así será más factible que podamos ayudarte.

Saludos
Leo
  #3 (permalink)  
Antiguo 09/04/2015, 08:02
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, 5 meses
Puntos: 2658
Respuesta: Simple LEFT JOIN no Funciona

Pasemos un poco en limpio el script de la consulta:
Código MySQL:
Ver original
  1.     SUM (sol.monto) AS monto,
  2.     COUNT (s.dep) AS cuenta,
  3.     COUNT (DISTINCT sol.paciente) AS pacientes
  4.   FROM solc_servicios sol
  5.        INNER JOIN sadmint_servicios s ON sol.articulo = s.cod_serv
  6.        LEFT JOIN sadmint_clientes c ON sol.cliente = c.cod_resp
  7.  WHERE YEAR (sol.fecha) = 2015
  8.    AND MONTH (sol.fecha) = 02
  9.    AND s.dep = 'BANCO DE SANGRE'
  10.    AND C.TIPO NOT IN ('SEGUROS', 'EMPRESAS', 'PDVSA', 'FUNDACION')

Cambie el orden de la segunda tabla para que no se generen confusiones, en esa posicion queda un poco mas claro que la condicion con "sadmint_servicios" es mandatoria, mientras que con "sadmint_clientes" es opcional.
Ahora bien, el primer problema que yo le veo es que tienes esta condición:
Código MySQL:
Ver original
  1. AND C.TIPO NOT IN ('SEGUROS', 'EMPRESAS', 'PDVSA', 'FUNDACION')
Así escrita, esa condición es mandatoria, es decir, tiene que existir algun valor de esa lista en la tercera tabla (la de clientes), sin lo cual no devolverá datos. Pero como puede no existir ninguno, no devolverá nada.
¿Se entiende.
Por lo pronto yo cambiaría la sitaxis a esto:

Código MySQL:
Ver original
  1.     SUM (sol.monto) monto,
  2.     COUNT (s.dep) cuenta,
  3.     COUNT (DISTINCT sol.paciente) pacientes
  4.   FROM solc_servicios sol
  5.        INNER JOIN sadmint_servicios s ON sol.articulo = s.cod_serv
  6.        LEFT JOIN sadmint_clientes c ON sol.cliente = c.cod_resp
  7.  WHERE YEAR (sol.fecha) = 2015
  8.    AND MONTH (sol.fecha) = 2
  9.    AND s.dep = 'BANCO DE SANGRE'
  10.    AND (C.TIPO NOT IN ('SEGUROS', 'EMPRESAS', 'PDVSA', 'FUNDACION') OR C.TIPO  IS NULL)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 09/04/2015, 11:10
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 9 meses
Puntos: 19
Respuesta: Simple LEFT JOIN no Funciona

Modifique la consulta dejando asi:
Código MySQL:
Ver original
  1. SELECTSUM(sol.monto) monto,
  2. COUNT(s.dep) cuenta,
  3. COUNT(DISTINCT sol.paciente) pacientes
  4. FROM solc_servicios sol
  5. INNER JOIN sadmint_servicios s ON sol.articulo = s.cod_serv
  6. LEFT JOIN sadmint_clientes c ON sol.cliente = c.cod_resp
  7. WHERE YEAR (sol.fecha) = 2015
  8. AND MONTH (sol.fecha) = 2
  9. AND s.dep = 'BANCO DE SANGRE'
  10. -- AND (C.TIPO NOT IN ('SEGUROS', 'EMPRESAS', 'PDVSA', 'FUNDACION')
  11. AND C.TIPO  IS NULL

y ha funcionado correctamente, de verdad te agradezco mucho la ayuda.

Una consulta que tengo, yo tengo que consultar de la tabla sol_servicios todos estos datos:
Monto en Bsf por Tipo de pago (seguro, empresas, part, etc..)
Estudios por Tipo de pago
Clientes por Tipo de pago
Total de clientes
Total de Estudios
Total monto.

todos esos datos de las unidades (banco de sangre, laboratorio, etc...)

Yo arme ese SQL y cree un array (en php) y hice un foreach para que cada vez que toque una unidad consulte esos datos.

Pero existirá una forma mas Estable de realizar esa consulta? mas Eficaz? o mi solución esta bien?

Etiquetas: bd, fecha, join, left, select, simple, sql, tabla
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 01:21.