MySQL - case bajo rango de datos dados mysql

 
Vista:
Imágen de perfil de Hfr
Val: 26
Ha disminuido su posición en 5 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

case bajo rango de datos dados mysql

Publicado por Hfr (21 intervenciones) el 06/03/2017 19:35:30
hola chicos tengo un problema con esta consultada de myslql, me sale mal

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
SELECT  empleado.CC_EMPLEADO,empleado.FULLNOMBRE_EMPLEADO,novedad.*,
 
programa.nombre_programa,  novedad.VALOR_NOVEDAD, comceptos.NOMBRE_COMCEPTO, novedad.observaciones,
case  novedad.INDICADORTIPO_NOVEDAD
WHEN 1 then 'fija'
WHEN 0 then 'eventual'
else 'Sin definir'
end tiponovedad,
 
 IF(novedad.FECHA_NOVEDAD IS NULL, 'NO APLICA', DATE_FORMAT(novedad.FECHA_NOVEDAD, ' %d de %M %Y')) fregistro,
 
  IF(novedad.FECHAINICIO_NOVEDAD IS NULL, 'NO APLICA', DATE_FORMAT(novedad.FECHAINICIO_NOVEDAD, ' %d de %M %Y')) fin,
 
  IF(novedad.FECHAFIN_NOVEDAD IS NULL, 'NO APLICA', DATE_FORMAT(novedad.FECHAFIN_NOVEDAD, ' %d de %M %Y')) ffin,
 
CASE novedad.FECHAINICIO_NOVEDAD
WHEN   novedad.FECHAINICIO_NOVEDAD = null then 'no aplica '
else TIMESTAMPDIFF (DAY, novedad.FECHAINICIO_NOVEDAD, novedad.FECHAFIN_NOVEDAD)
end DIAS,
 
case novedad.FECHAFIN_NOVEDAD
WHEn novedad.FECHAFIN_NOVEDAD  = null then 'no aplica '
else timestampdiff (month,  novedad.FECHAINICIO_NOVEDAD, novedad.FECHAFIN_NOVEDAD )
end  MESES  ,
 
	CASE WHEN novedad.IDCOMCEPTO_NOVEDAD >8 <=14 then (
		SELECT
			SUM(
				TIMESTAMPDIFF (
					DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
 
				)
			)
 
 
		from
			novedad
		where
 
			YEAR(FECHA_NOVEDAD)= YEAR(
				CURDATE()
			)
			AND MONTH(FECHA_NOVEDAD)= MONTH(
				CURDATE()
			)
			and CCEMPLEADO_NOVEDAD = empleado.CC_EMPLEADO
 
        )
 
         WHEN novedad.IDCOMCEPTO_NOVEDAD >22 <26 then (
		SELECT
			SUM(
				TIMESTAMPDIFF (
					DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
				)
			)
		from
			novedad
		where
 
 
			YEAR(FECHA_NOVEDAD)= YEAR(
				CURDATE()
			)
			AND MONTH(FECHA_NOVEDAD)= MONTH(
				CURDATE()
			)
			and CCEMPLEADO_NOVEDAD = empleado.CC_EMPLEADO
 
 
        )
 
         WHEN novedad.IDCOMCEPTO_NOVEDAD >31 <38 then (
		SELECT
			SUM(
				TIMESTAMPDIFF (
					DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
				)
 
			)
		from
 
			novedad
		where
 
			YEAR(FECHA_NOVEDAD)= YEAR(
				CURDATE()
 
			)
			AND MONTH(FECHA_NOVEDAD)= MONTH(
				CURDATE()
			)
			and CCEMPLEADO_NOVEDAD = empleado.CC_EMPLEADO
 
        )
         WHEN novedad.IDCOMCEPTO_NOVEDAD >80 <87 then (
		SELECT
			SUM(
				TIMESTAMPDIFF (
					DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
				)
			)
		from
			novedad
		where
 
			YEAR(FECHA_NOVEDAD)= YEAR(
				CURDATE()
			)
			AND MONTH(FECHA_NOVEDAD)= MONTH(
				CURDATE()
			)
			and CCEMPLEADO_NOVEDAD = empleado.CC_EMPLEADO
 
        )
 
      else  null end as diast
 
 
FROM
	empleado as empleado
	LEFT JOIN novedad novedad ON novedad.CCEMPLEADO_NOVEDAD = empleado.CC_EMPLEADO
	LEFT JOIN programa programa ON programa.id_programa = empleado.idprograma_empleado
	left join comceptos comceptos on comceptos.ID_COMCPETO = novedad.IDCOMCEPTO_NOVEDAD
WHERE
 
	empleado.idprograma_empleado = '2584' and empleado.CC_EMPLEADO=novedad.CCEMPLEADO_NOVEDAD
 
  and  MONTH(novedad.FECHA_NOVEDAD)=MONTH(CURDATE())
AND YEAR(novedad.FECHA_NOVEDAD)=YEAR(CURDATE())
 
    GROUP by novedad.ID_NOVEDAD
 
 
order by
	empleado.FULLNOMBRE_EMPLEADO asc
lo importante s le case de las fechas


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CASE WHEN novedad.IDCOMCEPTO_NOVEDAD >8 <14 then (
	SELECT
		SUM(
			TIMESTAMPDIFF (
				DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
 
			)
		)
 
 
	from
		novedad
	where
 
		YEAR(FECHA_NOVEDAD)= YEAR(
			CURDATE()
		)
		AND MONTH(FECHA_NOVEDAD)= MONTH(
			CURDATE()
		)
		and CCEMPLEADO_NOVEDAD = empleado.CC_EMPLEADO


en teoría cuando el id del concepto de la novedad no este dentro de los rangos que se inca en el case pues el dato debe de ser null, pero resulta que me toma los datos que no cumplen con la condición del case por ejemplo


novedad.IDCOMCEPTO_NOVEDAD >8 <14 then
aquí solo debería de tomar los id 9-10-11-12-13
y así sucesivamente, pero tengo id de otros valores diferentes a los del case y puff hace la operación en vez de mostrar null..
una manito pofis
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

case bajo rango de datos dados mysql

Publicado por leonardo_josue (414 intervenciones) el 07/03/2017 17:16:09
Hola Hfr:

En realidad tienes un horror de lógica booleana... lo que ocasiona un error en el resultado :S

Cuando utilizas comparaciones booleanas (es decir operaciones con comparadores tipo <, >, =, !=, etc) que te regresa un TRUE o un FALSE, la evaluación se realiza igual que las operaciones matemáticas, es decir, de respetando jerarquía de operadores, y de izquierda a derecha, veamos donde está el problema.

Tú tienes esto:

1
CASE WHEN novedad.IDCOMCEPTO_NOVEDAD >8 <14 then

supongamos un valor de IDCOMCEPTO = 5, entonces la condición quedaría así

1
CASE WHEN 5 > 8 < 14 THEN

primero se evalua la priumer parte (5>8) entonces "reduciendo la expresión, te regresa algo así:

1
CASE WHEN FALSE < 14 THEN

FALSE tiene el valor de 0 por lo tanto queda así:

1
CASE WHEN 0 < 14 THEN

y esto te regresa un valor de TRUE, lo que haría que se vaya por la opción THEN

checa aquí con tus datos:

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
32
33
34
35
36
37
38
39
40
41
mysql> SELECT * FROM tabla;
+--------------------+
| IDCOMCEPTO_NOVEDAD |
+--------------------+
|                  6 |
|                  7 |
|                  8 |
|                  9 |
|                 10 |
|                 11 |
|                 12 |
|                 13 |
|                 14 |
|                 15 |
|                 16 |
+--------------------+
11 rows in set (0.00 sec)
 
mysql> SELECT
    ->   IDCOMCEPTO_NOVEDAD,
    ->   CASE WHEN IDCOMCEPTO_NOVEDAD >8 <14
    ->        THEN 'en el rango'
    ->        ELSE 'fuera del rango'
    ->   END campo
    -> FROM tabla;
+--------------------+-------------+
| IDCOMCEPTO_NOVEDAD | campo       |
+--------------------+-------------+
|                  6 | en el rango |
|                  7 | en el rango |
|                  8 | en el rango |
|                  9 | en el rango |
|                 10 | en el rango |
|                 11 | en el rango |
|                 12 | en el rango |
|                 13 | en el rango |
|                 14 | en el rango |
|                 15 | en el rango |
|                 16 | en el rango |
+--------------------+-------------+
11 rows in set (0.00 sec)

¿Qué es lo que debes hacer entonces? estudiar lógica booleana para entender cómo se hacen las comparaciones de rangos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT
    ->   IDCOMCEPTO_NOVEDAD,
    ->   CASE WHEN IDCOMCEPTO_NOVEDAD >8 AND
    ->             IDCOMCEPTO_NOVEDAD < 14
    ->        THEN 'en el rango'
    ->        ELSE 'fuera del rango'
    ->   END campo
    -> FROM tabla;
+--------------------+-----------------+
| IDCOMCEPTO_NOVEDAD | campo           |
+--------------------+-----------------+
|                  6 | fuera del rango |
|                  7 | fuera del rango |
|                  8 | fuera del rango |
|                  9 | en el rango     |
|                 10 | en el rango     |
|                 11 | en el rango     |
|                 12 | en el rango     |
|                 13 | en el rango     |
|                 14 | fuera del rango |
|                 15 | fuera del rango |
|                 16 | fuera del rango |
+--------------------+-----------------+
11 rows in set (0.00 sec)

O si lo prefieres, utilizar el operador BETWEEN que hace las funciones de >= y <=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> SELECT
    ->   IDCOMCEPTO_NOVEDAD,
    ->   CASE WHEN IDCOMCEPTO_NOVEDAD BETWEEN 9 AND 13
    ->        THEN 'en el rango'
    ->        ELSE 'fuera del rango'
    ->   END campo
    -> FROM tabla;
+--------------------+-----------------+
| IDCOMCEPTO_NOVEDAD | campo           |
+--------------------+-----------------+
|                  6 | fuera del rango |
|                  7 | fuera del rango |
|                  8 | fuera del rango |
|                  9 | en el rango     |
|                 10 | en el rango     |
|                 11 | en el rango     |
|                 12 | en el rango     |
|                 13 | en el rango     |
|                 14 | fuera del rango |
|                 15 | fuera del rango |
|                 16 | fuera del rango |
+--------------------+-----------------+
11 rows in set (0.00 sec)

Haz la prueba y nos comentas.

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
1
Comentar
Imágen de perfil de Hfr
Val: 26
Ha disminuido su posición en 5 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

case bajo rango de datos dados mysql

Publicado por Hfr (21 intervenciones) el 07/03/2017 17:39:16
si tienes razon.
las deje de esta forma

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
WHEN novedad.IDCOMCEPTO_NOVEDAD BETWEEN 22 and 26 then (
	SELECT
		SUM(
			TIMESTAMPDIFF (
				DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
			)
		)
	from
		novedad
	where
 
 
	YEAR(FECHA_NOVEDAD)= YEAR(
		CURDATE()
	)
	AND MONTH(FECHA_NOVEDAD)= MONTH(
		CURDATE()
	)
	and CCEMPLEADO_NOVEDAD = empleado.CC_EMPLEADO
 
 
)


pero el
1
2
3
4
SUM(
	TIMESTAMPDIFF (
		DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
	)
me esta sumando el resto de los valores que no cumplen con la condición.
en teoría debería de sumarme los valores que que cumplen con la condición .
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

case bajo rango de datos dados mysql

Publicado por leonardo_josue (414 intervenciones) el 07/03/2017 20:39:35
Hola de nuevo:

¿Puedes colocar algunos datos de ejemplo y decirnos qué esperas obtener a partir de esos datos? creo que será más sencillo que tratar de entender tu lógica.

Saludos
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 Hfr
Val: 26
Ha disminuido su posición en 5 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

case bajo rango de datos dados mysql

Publicado por Hfr (21 intervenciones) el 08/03/2017 16:48:07
datos

SUM(
TIMESTAMPDIFF (
DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD
)
con los case yo hago una suma de los datos cuando se cumple la condición del case,
por lo general hay varios registros que cumplen con la condicion y yo hago una sumatoria
entonces supongamos que tengo 5 registros
3 de esos registros cumplen con la condición los otros dos no
entonces en teoría debería de hacer una sumatoria de los registros que cumplieron con la condición
la sumatoria radica en
TIMESTAMPDIFF (
DAY, FECHAINICIO_NOVEDAD, FECHAFIN_NOVEDAD)
aquí yo calculo el total de días que hay entre la fecha de inicio y de fin y con la función sum sumo todos los valores

en poca palabras es para gestionar los dias trabajados de un empleado cuando halla conceptos de incapacidades y vacaciones, entre otros
entonces si 3 registros corresponde a 3 incapacidades durante el mes digamos del 1 al 3 de marzo otra del 15 al 16 y otra del 20 al23 la sumatoria debería ser 7 días, y en la imgaen adjunta me suma todos los valores de los comcpetos que no estan dentro de los ragos del case y me da 43 y tan solo debira de tomar 14
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