MySQL - sumar campos null y no null por id

   
Vista:
Imágen de perfil de Antonio

sumar campos null y no null por id

Publicado por Antonio (3 intervenciones) el 22/02/2018 18:20:17
hola tengo una situación estoy tratando de sumar los campos null y no null por id de campo

ejemplo

campo 1 = 1 accion 1 hallazgo
campo 2 = 0 accion 0 hallazgo
campo 3 = 2 accion 2 hallazgo

solo que me manda esto

campo 1 = 3 accion 3 hallazgo
campo 2 = 3 accion 3 hallazgo
campo 3 = 3 accion 3 hallazgo

solo me suma los campos pero no me separa por id

este es mi código donde lo hago con un if

1
2
3
4
5
6
7
8
9
SELECT a.texto as titulo,b.id_pregunta,
SUM(CASE WHEN b.valor = 1 THEN 1 ELSE 0 END) AS "si",
SUM(CASE WHEN b.valor = 0 THEN 1 ELSE 0 END) AS "NO",
SUM( IF(b.id_pregunta = a.id and b.hallazgo IS NOT NULL, 1, 0)) as hallazgos,
SUM( IF(b.id_pregunta = a.id and b.Accion IS NOT NULL, 1, 0)) as acciones,
SUM( IF(b.id_pregunta = a.id and b.hallazgo IS NULL, 1, 0)) as no hallazgos,
SUM( IF(b.id_pregunta = a.id and b.Accion IS NULL, 1, 0)) as no acciones
FROM respuestas a INNER JOIN opciones b ON a.id = b.id_pregunta WHERE a.idenc = 19
GROUP BY a.id,a.texto,b.id_pregunta

este es otro codigo donde lo hago con un case

1
2
3
4
5
6
7
8
9
SELECT a.texto as titulo,b.id_pregunta,
SUM(CASE WHEN b.valor = 1 THEN 1 ELSE 0 END) AS "si",
SUM(CASE WHEN b.valor = 0 THEN 1 ELSE 0 END) AS "NO",
SUM(CASE WHEN b.hallazgo IS NOT NULL THEN 1 ELSE 0 END) AS "NO",
SUM(CASE WHEN b.Accion IS NOT NULL THEN 1 ELSE 0 END) AS "NO",
SUM(CASE WHEN b.hallazgo IS NULL THEN 1 ELSE 0 END) AS "NO",
SUM(CASE WHEN b.Accion IS NULL THEN 1 ELSE 0 END) AS "NO"
FROM respuestas a INNER JOIN opciones b ON a.id = b.id_pregunta WHERE a.idenc = 19
GROUP BY a.id,a.texto,b.id_pregunta
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

sumar campos null y no null por id

Publicado por Leonardo Josué (383 intervenciones) el 22/02/2018 22:34:47
Hola Antonio:

No me queda claro cómo es la estructura de tus tablas y qué información tienes en ellas, podrías postear el script de creación de cada tabla y poner algunos datos de ejemplos de cada una de ellas... y a partir de estos datos dinos qué es lo que estás esperando como salida, así será más fácil que podamos tratar de ayudarte.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio

sumar campos null y no null por id

Publicado por Antonio (3 intervenciones) el 22/02/2018 23:30:39
1
2
3
4
5
6
7
8
9
10
11
12
13
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `respuestas`
--
 
CREATE TABLE `respuestas` (
  `id` int(11) NOT NULL,
  `texto` varchar(250) COLLATE utf8mb4_spanish_ci NOT NULL,
  `idenc` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;
 
--

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- Volcado de datos para la tabla `respuestas`
--
 
INSERT INTO `respuestas` (`id`, `texto`, `idenc`) VALUES
(31, 'El personal esta usando el EPP definido en el estÃ', 19),
(32, 'sensores y/o guardas en funcionamiento?', 19),
(33, 'señalamientos y salidas de emergencia estan en bu', 19),
(34, 'las instrucciones de trabajo estan presentes y dis', 19),
(35, 'la 1era pieza esta identificada y disponible en el', 19),
(36, 'la hoja de mantenimiento autonomo esta actualizada', 19),
(37, 'el operador realiza su operacion de acuerdo a la i', 19),
(38, 'materiales identificados y en su caso segregados', 19),
(39, 'registro de calidad realizados', 19),
(40, 'hay registros de liberación de primera pieza', 19),
(41, 'pieza master / muestras NG - OK disponibles', 19),
(42, 'los indicadores estan posteados y actualizados', 19),
(43, '', 19);


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `opciones`
--
 
CREATE TABLE `opciones` (
  `ID` int(11) NOT NULL,
  `id_pregunta` int(50) DEFAULT NULL,
  `idenc` int(50) DEFAULT NULL,
  `valor` int(50) DEFAULT NULL,
  `hallazgo` varchar(250) COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `Accion` varchar(250) COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `fecha` date NOT NULL,
  `hora` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--
-- Volcado de datos para la tabla `opciones`
--
 
INSERT INTO `opciones` (`ID`, `id_pregunta`, `idenc`, `valor`, `hallazgo`, `Accion`, `fecha`, `hora`) VALUES
(245, 31, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(246, 32, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(247, 33, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(248, 34, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(249, 35, 19, 0, 'no se tiene la pieza', 'seguimiento a la accion', '0000-00-00', '0000-00-00'),
(250, 36, 19, 0, 'no se encuentra actualizada', 'actualizar la hoja ', '0000-00-00', '0000-00-00'),
(251, 37, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(252, 38, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(253, 39, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(254, 40, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(255, 41, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(256, 42, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
(257, 43, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00');

este es el resultado que actual mete obtengo
titulo id_pregunta si NO accion not null accion null hallazgo not null hallazgo null
El personal esta usando el EPP definido en el està 31 1 0 1 0 1 0
sensores y/o guardas en funcionamiento? 32 1 0 1 0 1 0
señalamientos y salidas de emergencia estan en bu 33 0 1 1 0 1 0
las instrucciones de trabajo estan presentes y dis 34 0 1 1 0 1 0
la 1era pieza esta identificada y disponible en el 35 1 0 1 0 1 0

resultado que requiero

titulo id_pregunta si NO accion not null accion null hallazgo not null hallazgo null
El personal esta usando el EPP definido en el està 31 1 0 0 1 0 1
sensores y/o guardas en funcionamiento? 32 1 0 0 1 0 1
señalamientos y salidas de emergencia estan en bu 33 0 1 1 0 1 0
las instrucciones de trabajo estan presentes y dis 34 0 1 1 0 1 0
la 1era pieza esta identificada y disponible en el 35 1 0 0 1 0 1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

sumar campos null y no null por id

Publicado por Leonardo Josué (383 intervenciones) el 23/02/2018 18:19:16
Hola Antonio:

Aun tengo problemas para entender lo que planteas, sin embargo, revisando tus datos, veo un detalle que igual y puede ser el problema:

según tus datos, tienes esto:

1
2
INSERT INTO `opciones` (`ID`, `id_pregunta`, `idenc`, `valor`, `hallazgo`, `Accion`, `fecha`, `hora`) VALUES
(245, 31, 19, 1, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),

en este caso el valor para los campos "valor" y "hallazgo" lo estás guardando como una CADENA con el valor de "NULL" no con el valor de NULL

observa este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> INSERT INTO `opciones` (`ID`, `id_pregunta`, `idenc`, `valor`, `hallazgo`
, `Accion`, `fecha`, `hora`) VALUES
    -> (1, 31, 19, 1, NULL, NULL, '0000-00-00', '0000-00-00'),
    -> (2, 31, 19, 0, 'NULL', 'NULL', '0000-00-00', '0000-00-00'),
    -> (3, 31, 19, 1, NULL, NULL, '0000-00-00', '0000-00-00'),
    -> (4, 31, 19, 0, 'OTRA CADEDA', 'OTRA CADENA', '0000-00-00', '0000-00-00');
 
Query OK, 4 rows affected (0.10 sec)
Records: 4  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM opciones;
+----+-------------+-------+-------+-------------+-------------+------------+------------+
| ID | id_pregunta | idenc | valor | hallazgo    | Accion      | fecha      | hora       |
+----+-------------+-------+-------+-------------+-------------+------------+------------+
|  1 |          31 |    19 |     1 | NULL        | NULL        | 0000-00-00 | 0000-00-00 |
|  2 |          31 |    19 |     0 | NULL        | NULL        | 0000-00-00 | 0000-00-00 |
|  3 |          31 |    19 |     1 | NULL        | NULL        | 0000-00-00 | 0000-00-00 |
|  4 |          31 |    19 |     0 | OTRA CADEDA | OTRA CADENA | 0000-00-00 | 0000-00-00 |
+----+-------------+-------+-------+-------------+-------------+------------+------------+
4 rows in set (0.00 sec)

Observa que en los insert, estoy mezclando registros con NULL y con 'NULL', al hacer un SELECT podrías pensar que tienes tres valores con el valor de NULL, pero observa qué pasa cuando intentas filtrar dependiendo de los valores HALLAZGO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mysql> select id, id_pregunta , hallazgo
    -> from opciones
    -> WHERE hallazgo IS NULL;
+----+-------------+----------+
| id | id_pregunta | hallazgo |
+----+-------------+----------+
|  1 |          31 | NULL     |
|  3 |          31 | NULL     |
+----+-------------+----------+
2 rows in set (0.00 sec)
 
mysql> SELECT id, id_pregunta , hallazgo
    -> FROM opciones
    -> WHERE hallazgo IS NOT NULL;
+----+-------------+-------------+
| id | id_pregunta | hallazgo    |
+----+-------------+-------------+
|  2 |          31 | NULL        |
|  4 |          31 | OTRA CADEDA |
+----+-------------+-------------+
2 rows in set (0.00 sec)
 
mysql> SELECT id, id_pregunta , hallazgo
    -> FROM opciones
    -> WHERE hallazgo  = 'NULL';
+----+-------------+----------+
| id | id_pregunta | hallazgo |
+----+-------------+----------+
|  2 |          31 | NULL     |
+----+-------------+----------+
1 row in set (0.00 sec)

¿Se entiende el problema? entonces, lo mismo pasa si haces una suma condicional, insisto, aunque en la BD's aparentemente hay 3 campos con NULL, en la suma no corresponden con estos valores:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT
    ->   id_pregunta,
    ->   SUM(CASE WHEN hallazgo IS NULL THEN 1 ELSE 0 END) total_nulos,
    ->   SUM(CASE WHEN hallazgo IS NOT NULL THEN 1 ELSE 0 END) total_no_nulos
    -> FROM opciones
    -> GROUP BY id_pregunta;
+-------------+-------------+----------------+
| id_pregunta | total_nulos | total_no_nulos |
+-------------+-------------+----------------+
|          31 |           2 |              2 |
+-------------+-------------+----------------+
1 row in set (0.00 sec)

Dale un vistazo a ver si este es el problema.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad