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

Consulta con if anidados

Estas en el tema de Consulta con if anidados en el foro de Mysql en Foros del Web. Estimados. Alguna Ayuda con esto. Cita: SELECT A.CodigoInterno FROM `Inventario` AS A, `Controles` AS C WHERE A.CodigoInterno=C.CodigoInterno AND Ultima='1' IF(A.SeCalibra='Si',IF(DATEDIFF(C.CertHasta,CURDAT E())>0),IF(A.SeVerifica='Si',IF(DATEDIFF(C.CertHas ta,CURDATE())>0),IF(A.SeMentiene='Si',IF(DATEDIFF( C.CertHasta,CURDATE())>0),1,0),1),0),IF(A.SeMantie ne='Si',IF(DATEDIFF(C.CertHasta,CURDATE())>0),1,0) ,1)),0),IF(A.SeVerifica='Si',IF(DATEDIFF(C.CertHas ...
  #1 (permalink)  
Antiguo 20/07/2010, 16:49
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Exclamación Consulta con if anidados

Estimados.

Alguna Ayuda con esto.


Cita:
SELECT A.CodigoInterno FROM `Inventario` AS A, `Controles` AS C WHERE A.CodigoInterno=C.CodigoInterno AND Ultima='1' IF(A.SeCalibra='Si',IF(DATEDIFF(C.CertHasta,CURDAT E())>0),IF(A.SeVerifica='Si',IF(DATEDIFF(C.CertHas ta,CURDATE())>0),IF(A.SeMentiene='Si',IF(DATEDIFF( C.CertHasta,CURDATE())>0),1,0),1),0),IF(A.SeMantie ne='Si',IF(DATEDIFF(C.CertHasta,CURDATE())>0),1,0) ,1)),0),IF(A.SeVerifica='Si',IF(DATEDIFF(C.CertHas ta,CURDATE())>0),IF(A.SeMantiene='Si',IF(DATEDIFF( C.CertHasta,CURDATE())>0),1,0,1),0),IF(A.SeMantien e='Si',IF(DATEDIFF(C.CertHasta,CURDATE())>0),1,0), 0)))
Son vArias condiciones dentro de una consulta pero no se que puede estar mal, tengo un ejemplo echo en excel para el funcionamiento
  #2 (permalink)  
Antiguo 20/07/2010, 17:30
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 con if anidados

Tienes dos problemas:
1) Tantos IFs anidados resultan muy difíciles de seguir o de resolver desde el punto de vista lógico. Es muy probable que una serie de subconsultas pudiera darte el mismo resultado sin tener que complicar la lógica de la misma.
De hecho, es muy difícil, a simple vista y sin una prueba de escritorio, estar seguros de qué es lo que estás intentando plantear con esos IFs.
2) Esos IFs en el WHERE no guardan ninguna conexión con el resto de las condiciones del mismo. De hecho ni siquiera están conectados por un operador lógico, por lo que es muy probable que te esté dando un error de sintaxis.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 20/07/2010, 21:25
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Exclamación Respuesta: Consulta con if anidados

gnzsoloyo, te explico aver si puedes orientarme.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tienes dos problemas:
1) Tantos IFs anidados resultan muy difíciles de seguir o de resolver desde el punto de vista lógico. Es muy probable que una serie de subconsultas pudiera darte el mismo resultado sin tener que complicar la lógica de la misma.
De hecho, es muy difícil, a simple vista y sin una prueba de escritorio, estar seguros de qué es lo que estás intentando plantear con esos IFs.
2) Esos IFs en el WHERE no guardan ninguna conexión con el resto de las condiciones del mismo. De hecho ni siquiera están conectados por un operador lógico, por lo que es muy probable que te esté dando un error de sintaxis.
Tengo 2 tablas una se llama Inventario y la otra controles, en inventario tengo la descripción del equipo y en controles la información delos controles realizados Calibración, verificación y mantención los cuales tienen un periodo de duración

tengo que confeccionar una consulta para evaluar cada equipo del inventario si sus controles están al día en la tabla inventario esta la información de que controles aplican a cada uno de ellos, en la tabla controles esta el historial de cada uno de los controles por equipo:

CREATE TABLE IF NOT EXISTS `Inventario` (
`Id` int(255) NOT NULL auto_increment,
`Equipo` varchar(255) collate utf8_spanish_ci default NULL,
`Marca` varchar(255) collate utf8_spanish_ci default 'Sin Marca',
`Proveedor` varchar(255) collate utf8_spanish_ci default NULL,
`FechaRecepcion` date default NULL,
`FechaInicio` date default NULL,
`CodigoInterno` varchar(255) collate utf8_spanish_ci default NULL,
`CodArea` varchar(1) collate utf8_spanish_ci NOT NULL,
`CodEquip` int(255) NOT NULL,
`CodAcc` int(255) NOT NULL,
`Rango` varchar(255) collate utf8_spanish_ci default 'Sin Rango',
`Resolucion` varchar(255) collate utf8_spanish_ci default 'Sin Resolucion',
`SeVerifica` varchar(255) collate utf8_spanish_ci NOT NULL,
`SeCalibra` varchar(255) collate utf8_spanish_ci NOT NULL,
`SeMantiene` varchar(255) collate utf8_spanish_ci NOT NULL,
`PerVer` varchar(255) collate utf8_spanish_ci default NULL,
`PerCal` varchar(255) collate utf8_spanish_ci default NULL,
`PerMan` varchar(255) collate utf8_spanish_ci NOT NULL,
`Ubicacion` varchar(255) collate utf8_spanish_ci default NULL,
`RangoCal` varchar(255) collate utf8_spanish_ci default NULL,
`RangoVer` varchar(255) collate utf8_spanish_ci NOT NULL,
`Responsable` varchar(255) collate utf8_spanish_ci default NULL,
`Estado` varchar(255) collate utf8_spanish_ci NOT NULL,
`FechaEstado` date NOT NULL,
`AreaAsignada` varchar(255) collate utf8_spanish_ci NOT NULL,
`Observaciones` varchar(255) collate utf8_spanish_ci default NULL,
`ObservacionesEstado` varchar(255) collate utf8_spanish_ci NOT NULL,
`EstadoDesp` varchar(255) collate utf8_spanish_ci NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=0;


CREATE TABLE IF NOT EXISTS `Controles` (
`Id` int(4) NOT NULL auto_increment,
`CodigoInterno` varchar(100) collate utf8_spanish_ci default NULL,
`Intervalo` varchar(100) collate utf8_spanish_ci default NULL,
`CertificadoN` varchar(100) collate utf8_spanish_ci default NULL,
`CertDesde` date default NULL,
`CertHasta` date default NULL,
`Ultima` varchar(255) collate utf8_spanish_ci default NULL,
`SelloN` varchar(100) collate utf8_spanish_ci default NULL,
`Proveedor` varchar(100) collate utf8_spanish_ci default NULL,
`Control` varchar(255) collate utf8_spanish_ci NOT NULL,
`Conforme` varchar(2) collate utf8_spanish_ci NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=0;

la consulta deberia evaluar para cada equipo los campos SeCalibra,SeVerifica,SeMantiene, con las siguientes posibilidades:
  1. Cal-Ver-Man
  2. Cal-Ver
  3. Ver-Man
  4. Cal-Man
  5. Cal
  6. ver
  7. Man
  8. --- --- ---

luego buscar en la tabla controles si los controles que aplican a el están al día




Creo que seria algo Asi, de todas maneras si alguien tiene alguna otra idea.



Código:

SELECT * FROM Inventario AS A, Controles AS B WHERE A.CodigoInterno=B.CodigoInterno AND B.Ultima='1' AND  IF(A.SeCalibra='Si',IF(DATEDIFF(B.CertHAsta,CURDATE())>0 AND IF(...........
Si Alguien tiene alguna idea de como hacerlo ya que habia intentado con la consulta con la que hbri el tema. ayuda gente mas experimentada..



Gracias......Perrines
  #4 (permalink)  
Antiguo 21/07/2010, 05:55
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 con if anidados

Empecemos con una prueba:
Código MySQL:
Ver original
  1.   i.id, i.equipo, i.marca,
  2.   GROUP_CONCAT(IF(i.SeCalibra = 'Si', 'Cal',''),
  3.   IF(i.SeVerifica = 'Si', 'Ver',''),
  4.   IF(i.SeMantiene = 'Si', 'Man','') SEPARATOR ' - ')
  5. FROM inventario i INNER JOIN controles c USING(CodigoInterno)
  6.   c.Ultima='1' AND
  7.   DATEDIFF(c.CertHAsta,CURDATE())>0
  8. GROUP BY i.id;

Y algunas notas:
- Los tipos de columna tienen que corresponder al tipo de datos. No se ponen arbitrariamente, y por lo que se percibe estás usando VARCHAR(255) en partes donde los datos jamás llegarían a esa longitud, o bien donde los valores contenidos pueden expresarse de otra forma.
- SI tienes un campo con dos valores posibles (SI/NO, por ejemplo), no tiene sentido ponerlo ni como VARCHAR, ni como INT. En todo caso o usas ENUM o usas BOOLEAN.
- Si el campo es un flag de más de dos estados, usa ENUM
- SI es campo es un flag codificado con diferentes valores según un patrón de significados, usa datos de tipo entero.
- Si en un campo vas a usar sólo números, usa INT y no VARCHAR, usa menos espacio en disco y la comparación es más eficiente.
- No uses descripciones donde puedes usar PK de otras tablas. Aumentas la posibilidad de errores exponencialmente. Por caso: Los proveedores no deben ir como VARCHAR, sino estar en otra tabla y se deben relacionar ambas por la PK del proveedor. Eso tiene varias ventajas: Usar un ID único constante para cada proveedor, y evitar desperdiciar 247 caracteres en cada registro donde pongas esa clave. Este mismo esquema es el que se usa para todas las relaciones del mismo tipo.
__________________
¿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 21/07/2010, 09:29
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Consulta con if anidados

gnzsoloyo, la prueba me entrega el siguiente resultado fragmento :


1 Pie de Metro Smiec Cal
2 Prensa Compresión Controls CalVerMan


Lo que necesito es que por ejemplo para la prensa de compresion que tiene los 3 controles se evalue para cada uno de ellos si esta al dia ej:

Prensa Compresión Controls

Calibración fecha de vencimiento ( CertHasta ) 21-10-2010
Verificación fecha de Vencimiento ( CertHasta ) 12-8-2010
Mantención fecha de vencimiento ( CertHasta) 01-09-2010

Para el pie de metro solo tiene el control de Calibración solo se debe evaluar ese control

Pie de Metro

Calibración fecha de vencimiento ( CertHasta) 10-12-2010

como ves no todos los equipos tienen la misma cantidad de controles, la idea es que cuando undo de los controles asignados a cada equipo esta vencido no muestre el equipo.

las posibilidades de los controles son 7
  1. Cal-Ver-Man
  2. Ver-Man
  3. Cal-Man
  4. Cal
  5. Ver
  6. Man
  7. --- --- ---



ademas te adjunto un script en php que evalua las 7 posibilidades
Código PHP:
if(SeCalibra='Si'){
    if(
CalibracionVigente='Si'){
        if(
SeVerifica='Si'){
            if(
VerificacionVigente='Si'){
                if(
SeMantiene='Si'){
                    if(
MantencionVigente='Si'){
                        echo 
"CodigoInterno";
                    }else{
                     echo 
"Mantencion Vencida";
                    }
                }else{
                    echo 
"CodigoInterno";
                }
            }else{
                echo
"Verificacion Vencida";
            }
        }else{
            if(
SeMantiene='Si'){
                if(
Mantencionvigente='Si'){
                    echo 
"CodigoInterno";
                }else{
                    echo 
"Mantencion Vencida";
                }
            }else{
                echo 
"CodigoInterno";
            }
        }
    }else{
        echo 
"Calibracion Vencida";
    }

}else{
    if(
SeVerifica='Si'){
        if(
VerificacionVigente='Si'){
            if(
SeMantiene='Si'){
                if(
MantencionVigente='Si'){
                    echo 
"CodigoInterno";
                }else{
                    echo 
"MantencionVencida";
                }
            }else{
                echo 
"CodigoInterno";
            }
        }else{
            echo 
"Verificacion Vencida";
        }
    }else{
        if(
SeMantiene='Si'){
            if(
MantencionVigente='Si'){
                echo 
"Codigointerno";
            }else{
                echo 
"Mantencion Vencida";
            }
        }else{
            echo 
"Sin Controles";
        }
    }

  #6 (permalink)  
Antiguo 21/07/2010, 15:31
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Consulta con if anidados

O en realidad alguien que me ayude conun buen manual de Mysql....

Grax
  #7 (permalink)  
Antiguo 21/07/2010, 19:03
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 con if anidados

Ten paciencia... Uno también trabaja para vivir, y responder en horario de trabajo es complicado.
Por lo demás, con las pautas que te he dado podrías, en realidad, resolver odo por ti mismo... Pero si me das hasta mañana te respondo con más detalle.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 22/07/2010, 16:42
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 con if anidados

Cita:
Lo que necesito es que por ejemplo para la prensa de compresion que tiene los 3 controles se evalue para cada uno de ellos si esta al dia ej:

Prensa Compresión Controls

Calibración fecha de vencimiento ( CertHasta ) 21-10-2010
Verificación fecha de Vencimiento ( CertHasta ) 12-8-2010
Mantención fecha de vencimiento ( CertHasta) 01-09-2010

Para el pie de metro solo tiene el control de Calibración solo se debe evaluar ese control

Pie de Metro

Calibración fecha de vencimiento ( CertHasta) 10-12-2010
Mira, lo que estás planteando es un tipo de reporte, y en ese caso haydos formas genéricas de manejarlo:
1) Lo haces como planilla donde cada control tenga su propia columna o par de columnas y que el dato de la verificación. salga en su propia columna.
2) Lo haces en dos columnas de modo que te responda con un renglón por cada una.
En el primer caso hay que crear una columna que resuelva cada uno de los controles y estados posibles
En la segunda se hace por medio de tres consultas con UNION, cada una de las cuales resuelve uno de los estados. Como algunos de los elementos del inventario sólo aparecerán en un caso (los NULL no cuentan), al ordenarlo por artículo y control los registros aparecerán en grupos como los necesitas.

Todo depende de qué es lo que prefieras...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 22/07/2010, 18:45
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Consulta con if anidados

Gracias gnzsoloyo.


hare las pruebas y lo seguire intentando, gracias por las pautas...


Sldos.

Etiquetas: anidados
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 19:41.