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

[SOLUCIONADO] Principiante SUMA DOS CAMPOS CON CONDICONAL

Estas en el tema de Principiante SUMA DOS CAMPOS CON CONDICONAL en el foro de Mysql en Foros del Web. Estimados: Me estoy dando contra la pared desde ayer. Necesito consultar la meta de actividades nuevas y antiguas agrupadas por equipo en base a una ...
  #1 (permalink)  
Antiguo 17/02/2015, 14:36
 
Fecha de Ingreso: septiembre-2010
Mensajes: 32
Antigüedad: 13 años, 7 meses
Puntos: 0
Principiante SUMA DOS CAMPOS CON CONDICONAL

Estimados:

Me estoy dando contra la pared desde ayer.

Necesito consultar la meta de actividades nuevas y antiguas agrupadas por equipo en base a una tabla que se llama programamcion y calcular la produccion de actividades nuevas y antiguas realizadas (esto ya lo tengo resuelto)

El problema es que con la consulta que se adjunta, me arroja la produccion sin problemas separada tal como quiero pero la meta me da como resultado "40" cuando deberia ser "8"

CONSULTA:

Código MySQL:
Ver original
  1. ROUND( (SUM(programacion.nuevas+programacion.antiguas) )  , 0 ) as META,
  2. ROUND( (SUM(produccion.tipo='antigua' AND programacion.usuario=produccion.usuario AND programacion.equipo='z'))  , 0 ) as PRODUCCION_ANTIGUA,
  3. ROUND( (SUM(produccion.tipo='nueva' AND programacion.usuario=produccion.usuario AND programacion.equipo='z'))  , 0 ) as PRODUCCION_NUEVAS
  4. FROM `programacion`, `produccion` where programacion.equipo='z'

Para simplificar el problema adjunto estructura
Código MySQL:
Ver original
  1. --
  2. -- Base de datos: `problema`
  3. --
  4.  
  5. -- --------------------------------------------------------
  6.  
  7. --
  8. -- Estructura de tabla para la tabla `produccion`
  9. --
  10.  
  11. CREATE TABLE IF NOT EXISTS `produccion` (
  12.   `id` int(11) NOT NULL AUTO_INCREMENT,
  13.   `usuario` varchar(10) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  14.   `tipo` varchar(10) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  15.   `fecha` date NOT NULL,
  16.   PRIMARY KEY (`id`)
  17.  
  18. --
  19. -- Volcar la base de datos para la tabla `produccion`
  20. --
  21.  
  22. INSERT INTO `produccion` (`id`, `usuario`, `tipo`, `fecha`) VALUES
  23. (1, 'a', 'antigua', '2015-02-17'),
  24. (2, 'a', 'antigua', '2015-02-16'),
  25. (3, 'b', 'antigua', '2015-02-17'),
  26. (4, 'a', 'nueva', '2015-02-17'),
  27. (5, 'c', 'antigua', '2015-02-01');
  28.  
  29. -- --------------------------------------------------------
  30.  
  31. --
  32. -- Estructura de tabla para la tabla `programacion`
  33. --
  34.  
  35. CREATE TABLE IF NOT EXISTS `programacion` (
  36.   `id` int(5) NOT NULL,
  37.   `usuario` varchar(10) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  38.   `equipo` varchar(20) NOT NULL,
  39.   `nuevas` int(5) NOT NULL,
  40.   `antiguas` int(5) NOT NULL,
  41.   PRIMARY KEY (`usuario`),
  42.   KEY `id` (`id`)
  43.  
  44. --
  45. -- Volcar la base de datos para la tabla `programacion`
  46. --
  47.  
  48. INSERT INTO `programacion` (`id`, `usuario`, `equipo`, `nuevas`, `antiguas`) VALUES
  49. (1, 'a', 'z', 3, 2),
  50. (2, 'b', 'z', 1, 2),
  51. (3, 'c', 'x', 1, 1),
  52. (4, 'd', 'x', 1, 1);

Última edición por gnzsoloyo; 18/02/2015 a las 19:07
  #2 (permalink)  
Antiguo 17/02/2015, 15:48
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Principiante SUMA DOS CAMPOS CON CONDICONAL

Hola clnetcom:

No me queda muy claro, pero algunos detalles que tienes que revisar:

Primero, NO ESTÁS COLOCANDO NINGUNA RELACIÓN ENTRE TUS TABLAS, por lo tanto se está realizando un PRODUCTO CARTESIANO entre las tablas... checa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +--------+--------+
  3. | campo1 | campo2 |
  4. +--------+--------+
  5. |      1 | uno    |
  6. |      2 | dos    |
  7. |      3 | tres   |
  8. +--------+--------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +--------+--------+
  13. | campo1 | campo2 |
  14. +--------+--------+
  15. |      1 | one    |
  16. |      2 | two    |
  17. +--------+--------+
  18. 2 rows in set (0.00 sec)

Observa que hay una relación entra las tablas, dada por el CAMPO1, para obtener su descripcion en español y en inglés... Ahora, tal como lo estás haciendo tú, es decir, poniendo las dos tablas en el FROM observa qué pasa:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2;
  2. +--------+--------+--------+--------+
  3. | campo1 | campo2 | campo1 | campo2 |
  4. +--------+--------+--------+--------+
  5. |      1 | uno    |      1 | one    |
  6. |      1 | uno    |      2 | two    |
  7. |      2 | dos    |      1 | one    |
  8. |      2 | dos    |      2 | two    |
  9. |      3 | tres   |      1 | one    |
  10. |      3 | tres   |      2 | two    |
  11. +--------+--------+--------+--------+
  12. 6 rows in set (0.00 sec)

Lo mismo pasa aunque filtes un registro (como lo haces con los del equipo = 'Z')

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2 WHERE tabla2.campo1 = 1;
  2. +--------+--------+--------+--------+
  3. | campo1 | campo2 | campo1 | campo2 |
  4. +--------+--------+--------+--------+
  5. |      1 | uno    |      1 | one    |
  6. |      2 | dos    |      1 | one    |
  7. |      3 | tres   |      1 | one    |
  8. +--------+--------+--------+--------+
  9. 3 rows in set (0.00 sec)

Esto es un producto cartesiano... Lo que debes hacer es especificar CÓMO ESTÁN RELACIONADAS ESTAS TABLAS, de preferencia utilizando JOINS en lugar de la forma en que tú lo estás haciendo.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE
  3.     -> tabla1.campo1 = tabla2.campo1 AND
  4.     -> tabla2.campo1 = 1;
  5. +--------+--------+--------+--------+
  6. | campo1 | campo2 | campo1 | campo2 |
  7. +--------+--------+--------+--------+
  8. |      1 | uno    |      1 | one    |
  9. +--------+--------+--------+--------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tabla1
  13.     -> INNER JOIN tabla2 ON tabla1.campo1 = tabla2.campo1
  14.     -> WHERE
  15.     -> tabla2.campo1 = 1;
  16. +--------+--------+--------+--------+
  17. | campo1 | campo2 | campo1 | campo2 |
  18. +--------+--------+--------+--------+
  19. |      1 | uno    |      1 | one    |
  20. +--------+--------+--------+--------+
  21. 1 row in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo
  #3 (permalink)  
Antiguo 18/02/2015, 14:25
 
Fecha de Ingreso: septiembre-2010
Mensajes: 32
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Principiante SUMA DOS CAMPOS CON CONDICONAL

MAESTRO

ME resulto eso de los JOIN pero ahora me aparece el siguiente problema al hacer JOIN me resulta una tabla con 290 registros que se complementan con los datos de ambas tablas, puedo así sumar los datos de los 290 registros, pero es esta tabla de 290 registros es el resultado de una tabla que tiene 4 registro con una de 2000, el tema es que no he podido encontrar la forma de sumar el valor de los 4 campos en la misma consulta mysql.

Para ejemplificar tengo cuatro operarios en la tabla programamcion ID 1, 2, 3 y 4 cada uno tiene una meta de actividades a realizar ejemplo
ID 1=3
ID 2=2
ID 3=5
ID 4=3
entro todos suman 13 actividades.

En la tabla producción hay un numero de registros ejemplo
ID 1=2 registros
ID 2=1 registros
ID 3=3 registros
ID 4=2 registros
Entre ellos suman 8 actividades realizadas

MI PROBLEMA es poder hacer una consulta MYSQL que me de el numero de actividades comprometidas 13 y las realizadas por los operarios 8, como Bonus track que aparezca el 61.5 % de cumplimiento.

Cuando hago la operacion por ID no hay problema, es decir he podido obtener el resultado al evaluar por operario, pero cuando quiero evaluar al grupo no me resulta la consulta.

Puede ser que me este ahogando en un vaso de agua y ojala sea así.

Saludos desde Chile
  #4 (permalink)  
Antiguo 19/02/2015, 12:18
 
Fecha de Ingreso: septiembre-2010
Mensajes: 32
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Principiante SUMA DOS CAMPOS CON CONDICONAL

Estimados al final pude resolver el problema con "subconsulta"

Etiquetas: condicionales, suma
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 13:09.