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

[SOLUCIONADO] Select case

Estas en el tema de Select case en el foro de Mysql en Foros del Web. Hola, resulta que estoy realizando un case en mysql para comparar entre que rangos queda una cantidad pero no se que pudiese estar haciendo mal ...
  #1 (permalink)  
Antiguo 12/03/2013, 15:12
 
Fecha de Ingreso: abril-2012
Mensajes: 11
Antigüedad: 11 años, 11 meses
Puntos: 1
Select case

Hola, resulta que estoy realizando un case en mysql para comparar entre que rangos queda una cantidad pero no se que pudiese estar haciendo mal ya que al momento de ejecutar la consulta no me arroja ningun resultado, cabe destacar que si pongo las cantidades exactas ahi si logra encontrarla pero si la pongo que quede entre un rango de los que manejo no me arroja nada.

Esta es mi consulta:

Código:
select limiteinferior,porciento, cuotafija, limiteinferior=
case
when limiteinferior < 244.8 then 0.00
when limiteinferior > 244.81 and limitesuperior < 2077.50 then 4.65
when limiteinferior > 2077.51 and limitesuperior < 3651.00 then 121.95
when limiteinferior > 3651.01 and limitesuperior < 4244.10 then 293.25
when limiteinferior > 4244.11 and limitesuperior < 5081.40 then 388.05
when limiteinferior > 5081.41 and limitesuperior < 10248.45 then 538.20
when limiteinferior > 10248.46 and limitesuperior < 16153.05 then 1641.75

end
from isr where limiteinferior=4245 and limitesuperior=5080;
Y a lo que me refiero de que si pongo cantidades exactas es lo siguiente:

Si le pongo Where limiteinferior=4244.11 and limitesuperior=5081.40

De esta forma si me arroja lo que deseo pero lo que yo quiero hacer es poner x ejemplo 4500 y que me diga que queda entre ese rango.

Espero me haya dado a entender y me puedan ayudar salu2 y gracias.
  #2 (permalink)  
Antiguo 12/03/2013, 16:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Select case

Hola Bhrentox:

No termino de entender en primer lugar qué es lo que esperas obtener como salida y en segundo lugar dónde está el problema. Creo que es conveniente que nos pusieras algunos datos de ejemplo de tu tabla y nos dijeras qué es lo que estás esperando como salida.

Por lo pronto, algunas observaciones.

El CASE-WHEN tal como lo estás colocando en realidad no está abarcando todos los posibles valores, es decir, puede haber combinaciones que no caigan en ninguna categoría...

Por ejemplo qué pasaría con la combinación

Código:
limiteinferior=4244.11 and limitesuperior=5081.40
En realidad estos valores NO ENTRAN EN NINGUNA CATEGORÍA, decir,

Código:
4244.11 NO ES MAYOR A 4244.11 (es igual) 
5081.40 NO ES MAYOR 5081.40 (es igual)
Igual y podrías tratar de cambiar los > por >= para ver si eso resuelve tus problemas, pero insisto en que tienes un problema de concepto, pero para ayudarte, deberías cómo están tus datos y cuáles solo los rangos que quieres manejar y qué es lo que necesitas obtener como salida

Saludos
Leo.
  #3 (permalink)  
Antiguo 13/03/2013, 09:18
 
Fecha de Ingreso: abril-2012
Mensajes: 11
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Select case

Hola, me explico lo que tenia que hacer era lo siguiente:

-Tengo una tabla en mi BD que se llama isr que tiene las sig columnas:

limiteinferior
limitesuperior
cuotafija
porciento

Lo que yo intentaba hacer era esto yo recibo un sueldo x ejemplo 4500 tendria que lanzar la consulta para que me ubicara en que rango entra y ademas de eso me trajera la cuota fija y el porciento para utilizarlos en una operacion mas adelante.

Y gracias a tu ayuda leonardo XD pude resolverlo ya que como bien dices necesitaba agregar los signos = y e echo lo mismo en el where agregando los signos de >< para que busque en esos rangos en verdad muchas gracias y espero con esto hayas entendido un poco de lo que claramente no pude explicar arriba XD salu2 y gracias.

Aqui pongo mi solucion x si a alguien le sirve en algun momento


Código:
select porciento, cuotafija, limiteinferior=
case
when limiteinferior <=244.8 then 0.00
when limiteinferior >=244.81 and limitesuperior <= 2077.50 then 4.65
when limiteinferior >=2077.51 and limitesuperior <= 3651.00 then 121.95
when limiteinferior >=3651.01 and limitesuperior <= 4244.10 then 293.25
when limiteinferior >=4244.11 and limitesuperior <= 5081.40 then 388.05
when limiteinferior >=5081.41 and limitesuperior <= 10248.45 then 538.20
when limiteinferior >=10248.46 and limitesuperior <= 16153.05 then 1641.75
ELSE 0.30
end


from isr where limiteinferior <=2077.52 and limitesuperior >=2077.52;
  #4 (permalink)  
Antiguo 14/03/2013, 14:23
 
Fecha de Ingreso: abril-2012
Mensajes: 11
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Select case

Hola, ahora tengo otro problema de que forma le podria hacer para que cuando reciba una cantidad mayor o igual a 16153.06 no me mande error?????

He visto que se puede usar un ELSE pero no consigo hacerlo de manera correcta si alguien pudiese ayudarme x favor se los agradeceria mucho salu2.
  #5 (permalink)  
Antiguo 14/03/2013, 14:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Select case

Hola de nuevo Bhrentox:

¿Qué error es el que te está marcando? porque así nomas jugando al adivino es casi imposible dar con el problema

desde mi punto de vista, tal como lo tienes es correcto:

Código:
...
...
ELSE 0.30
end
O podrías hacer algo como esto:

Código:
...
...
when limiteinferior >=10248.46 and limitesuperior <= 16153.05 then 1641.75
when limiteinferior >= 16153.06 or limitesuperior >= 16153.06 then 0.30
end
Pero igual y comienza por decirnos qué error te marca... Y si no te marca un error, pero los resultados que obtienes no son los esperados, entonces postea algunos datos de ejemplo de tu tabla y dinos qué es lo que esperas obtener como salida.

Saludos
Leo.
  #6 (permalink)  
Antiguo 15/03/2013, 09:56
 
Fecha de Ingreso: abril-2012
Mensajes: 11
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Select case

Hola, otra vez aca intentare explicarme mejor

Veras esos rangos estan basados en una tabla de mi base de datos llamada isr la cual tiene todos esos rangos lo malo es que al llegar al rango de 16153.06 la tabla esta asi

limiteinferior limitesuperior cuotafija porciento
16153.06 #VACIO# 3030.60 0.30

Intente meter 16153.06 en limite superior para que no quedase vacio e intentar lo que dices pero no funciono

Código:
when limiteinferior >= 16153.06 or limitesuperior >= 16153.06 then 0.30
end
Y mo manda ningun error simplemente dice empty query XD

Cualquier otra duda ponganla y tratare de explicarme.
  #7 (permalink)  
Antiguo 15/03/2013, 12:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Select case

Te lo puse en el post pasado y te lo vuelvo a comentar:

Cita:
Y si no te marca un error, pero los resultados que obtienes no son los esperados, entonces postea algunos datos de ejemplo de tu tabla y dinos qué es lo que esperas obtener como salida.
Pero vayamos por partes: El problema que mencionas NO ESTÁ EN EL CASE-WHEN sino en la condición WHERE que estás colocando. Si el resultado de la consulta es un query empty esto quiere decir que NO HAY INFORMACIÓN QUE CUMPLA CON LA CONDICIÓN WHERE, eso no tiene nada que ver con el CASE WHEN. Observa este caso, supongamos que tenemos estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM numeros;
  2. +--------+
  3. | numero |
  4. +--------+
  5. |      1 |
  6. |      2 |
  7. |      3 |
  8. |      4 |
  9. +--------+
  10. 4 rows in set (0.00 sec)

Si hacemos un CASE-WHEN para obtener la descripción de cada numero y hacemos un WHERE para buscar el número uno tenemos esto:

Código MySQL:
Ver original
  1. mysql> SELECT numero, CASE numero WHEN 1 THEN 'UNO'
  2.     ->                     WHEN 2 THEN 'DOS'
  3.     ->                     WHEN 4 THEN 'CUATRO'
  4.     ->         END descripcion
  5.     -> FROM numeros
  6.     -> WHERE numero = 1;
  7. +--------+-------------+
  8. | numero | descripcion |
  9. +--------+-------------+
  10. |      1 | UNO         |
  11. +--------+-------------+
  12. 1 row in set (0.00 sec)

Pero observa el caso del número 3, este número EXISTE EN LA TABLA, pero el CASE-WHEN NO CONSIDERA ESTE CASO... el resultado NO ES UN EMPTY QUERY sino un registro con el campo descripción NULL:

Código MySQL:
Ver original
  1. mysql> SELECT numero, CASE numero WHEN 1 THEN 'UNO'
  2.     ->                     WHEN 2 THEN 'DOS'
  3.     ->                     WHEN 4 THEN 'CUATRO'
  4.     ->         END descripcion
  5.     -> FROM numeros
  6.     -> WHERE numero = 3;
  7. +--------+-------------+
  8. | numero | descripcion |
  9. +--------+-------------+
  10. |      3 | NULL        |
  11. +--------+-------------+
  12. 1 row in set (0.00 sec)

Observa, ESTE SI ES UN PROBLEMA CON EL CASE-WHEN ya que no considera todos los casos, pero qué pasa si buscamos el numero 5 en la tabla??? el resultado es un EMPTY QUERY, como el que dices:

Código MySQL:
Ver original
  1. mysql> SELECT numero, CASE numero WHEN 1 THEN 'UNO'
  2.     ->                     WHEN 2 THEN 'DOS'
  3.     ->                     WHEN 3 THEN 'TRES'
  4.     ->                     WHEN 4 THEN 'CUATRO'
  5.     ->                     WHEN 5 THEN 'CINCO'
  6.     ->         END descripcion
  7.     -> FROM numeros
  8.     -> WHERE numero = 5;
  9. Empty set (0.00 sec)

Esto quiere decir que en la tabla NO EXISTE NINGÚN REGISTRO QUE CUMPLA LA CONDICIÓN WHERE, y aquí nada tiene que ver si el CASE-WHEN está correcto...

Perdóname, pero no termino de entender qué es lo que estás tratando de obtener...

Supongo que tu problema se refiere a determinar que ISR (impuesto sobre la renta) se asigna a determinado sueldo o salario, pero depende mucho de cómo tienes almacenada la información. Te pido otra vez, postea la estructura completa de tus tablas, pon algunos datos de ejemplo y dinos qué es lo que esperas obtener como salida.

Saludos
Leo.
  #8 (permalink)  
Antiguo 15/03/2013, 15:12
 
Fecha de Ingreso: abril-2012
Mensajes: 11
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Select case

Esta es la estructura de mi tabla de isr

+----+----------------+----------------+-----------+-----------+
| id | limiteinferior | limitesuperior | cuotafija | porciento |
+----+----------------+----------------+-----------+-----------+
| 1 | 0.01 | 244.80 | 0.00 | 0.02 |
| 2 | 244.81 | 2077.50 | 4.65 | 0.06 |
| 3 | 2077.51 | 3651.00 | 121.95 | 0.11 |
| 4 | 3651.01 | 4244.10 | 293.25 | 0.16 |
| 5 | 4244.11 | 5081.40 | 388.05 | 0.18 |
| 6 | 5081.41 | 10248.45 | 538.20 | 0.21 |
| 7 | 10248.46 | 16153.05 | 1641.75 | 0.24 |
| 8 | 16153.06 | | 3030.60 | 0.30 |
+----+----------------+----------------+-----------+-----------+

Cuando lanzo mi consulta x ejemplo esta :

Código:
select limiteinferior, porciento, cuotafija, limiteinferior=
case
when limiteinferior <=244.8 then 0.00
when limiteinferior >=244.81 and limitesuperior <= 2077.50 then 4.65
when limiteinferior >=2077.51 and limitesuperior <= 3651.00 then 121.95
when limiteinferior >=3651.01 and limitesuperior <= 4244.10 then 293.25
when limiteinferior >=4244.11 and limitesuperior <= 5081.40 then 388.05
when limiteinferior >=5081.41 and limitesuperior <= 10248.45 then 538.20
when limiteinferior >=10248.46 and limitesuperior <= 16153.05 then 1641.75
when limiteinferior >=16153.06  then 3030.60

end


from isr where limiteinferior <=20000.06 and limitesuperior >=20000.06;
Le estoy pidiendo que me devuelva el porciento, y la cuota fija correspondientes a este caso los cuales serian

121.95 | 0.11 |

Pero como te mencione anteriormente me devuelve un empty query

Si me falto de explicar algo x aca te respondo XD. salu2 y gracias x la ayuda
  #9 (permalink)  
Antiguo 17/03/2013, 10:54
 
Fecha de Ingreso: octubre-2008
Mensajes: 127
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Select case

Hola,

por lo que ocmentas, en la tabla no hay ningún valor con un límite superior a 20000, por lo que la query no devuelve nada.

Saludos.
  #10 (permalink)  
Antiguo 17/03/2013, 16:00
 
Fecha de Ingreso: abril-2012
Mensajes: 11
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Select case

Cita:
Iniciado por ComprasDesdeCasa Ver Mensaje
Hola,

por lo que ocmentas, en la tabla no hay ningún valor con un límite superior a 20000, por lo que la query no devuelve nada.

Saludos.
Asi es pero de que forma podria modificar mi consulta para que cuando llegue un valor superior a ese rango me devuelva lo que tengo en ese registro de la tabla salu2 y gracias.
  #11 (permalink)  
Antiguo 20/03/2013, 13:53
 
Fecha de Ingreso: octubre-2008
Mensajes: 127
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Select case

Hola,

No sé si te acabo de entender... El select case creo que es correcto para el resultado que esperas, lo que no entiendo es para qué le pones ese where detrás.
Creo que la consulta que buscas es sin el where:

Código SQL:
Ver original
  1. SELECT limiteinferior, porciento, cuotafija, limiteinferior=
  2. CASE
  3. WHEN limiteinferior <=244.8 THEN 0.00
  4. WHEN limiteinferior >=244.81 AND limitesuperior <= 2077.50 THEN 4.65
  5. WHEN limiteinferior >=2077.51 AND limitesuperior <= 3651.00 THEN 121.95
  6. WHEN limiteinferior >=3651.01 AND limitesuperior <= 4244.10 THEN 293.25
  7. WHEN limiteinferior >=4244.11 AND limitesuperior <= 5081.40 THEN 388.05
  8. WHEN limiteinferior >=5081.41 AND limitesuperior <= 10248.45 THEN 538.20
  9. WHEN limiteinferior >=10248.46 AND limitesuperior <= 16153.05 THEN 1641.75
  10. WHEN limiteinferior >=16153.06  THEN 3030.60
  11.  
  12. END
  13.  
  14.  
  15. FROM isr

Como que tienes un where tan exclusivo, es más ya de por sí no obtiene resultados, los valores de tu case no se tienen en cuenta.

Saludos.
  #12 (permalink)  
Antiguo 20/03/2013, 15:52
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Select case

Hola de nuevo Bhrentox:

Insisto en que te estás complicando de más la consulta... si lo que necesitas es obtener los de la tabla de un valor isr para un valor determinado ni siquiera hay necesidad de hacer un CASE-WHEN... sería así.

Supongamos que tu tabla isr la tienes así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM isr;
  2. +------+----------------+----------------+-----------+-----------+
  3. | id   | limiteinferior | limitesuperior | cuotafija | porciento |
  4. +------+----------------+----------------+-----------+-----------+
  5. |    1 | 0.01           | 244.80         | 0.00      | 0.02      |
  6. |    2 | 244.81         | 2077.50        | 4.65      | 0.06      |
  7. |    3 | 2077.51        | 3651.00        | 121.95    | 0.11      |
  8. |    4 | 3651.01        | 4244.10        | 293.25    | 0.16      |
  9. |    5 | 4244.11        | 5081.40        | 388.05    | 0.18      |
  10. |    6 | 5081.41        | 10248.45       | 538.20    | 0.21      |
  11. |    7 | 10248.46       | 16153.05       | 1641.75   | 0.24      |
  12. |    8 | 16153.06       | NULL           | 3030.60   | 0.30      |
  13. +------+----------------+----------------+-----------+-----------+
  14. 8 rows in set (0.00 sec)

Puedes hacer directamente la consulta poniendo el valor, sin el case, sólo con una condición WHERE:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM isr
  2.     -> WHERE (20000 BETWEEN limiteinferior AND limitesuperior) OR
  3.     ->       (20000 >= limiteinferior AND limitesuperior IS NULL);
  4. +------+----------------+----------------+-----------+-----------+
  5. | id   | limiteinferior | limitesuperior | cuotafija | porciento |
  6. +------+----------------+----------------+-----------+-----------+
  7. |    8 | 16153.06       | NULL           | 3030.60   | 0.30      |
  8. +------+----------------+----------------+-----------+-----------+
  9. 1 row in set (0.00 sec)


O podrías utilizar una variable, es exactamente lo mismo. estos casos coinciden con límites inferior y superir

Si quieres obtener los valores de la tabla para 5081.40, lo único que tienes que hacer es algo como esto:

Código MySQL:
Ver original
  1. mysql> SET @valor = 5081.40;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT * FROM isr
  5.     -> WHERE (@valor BETWEEN limiteinferior AND limitesuperior) OR
  6.     ->       (@valor >= limiteinferior AND limitesuperior IS NULL);
  7. +------+----------------+----------------+-----------+-----------+
  8. | id   | limiteinferior | limitesuperior | cuotafija | porciento |
  9. +------+----------------+----------------+-----------+-----------+
  10. |    5 | 4244.11        | 5081.40        | 388.05    | 0.18      |
  11. +------+----------------+----------------+-----------+-----------+
  12. 1 row in set (0.00 sec)
  13.  
  14. mysql> SET @valor = 5081.41;
  15. Query OK, 0 rows affected (0.00 sec)
  16.  
  17. mysql> SELECT * FROM isr
  18.     -> WHERE (@valor BETWEEN limiteinferior AND limitesuperior) OR
  19.     ->       (@valor >= limiteinferior AND limitesuperior IS NULL);
  20. +------+----------------+----------------+-----------+-----------+
  21. | id   | limiteinferior | limitesuperior | cuotafija | porciento |
  22. +------+----------------+----------------+-----------+-----------+
  23. |    6 | 5081.41        | 10248.45       | 538.20    | 0.21      |
  24. +------+----------------+----------------+-----------+-----------+
  25. 1 row in set (0.00 sec)

Dale un vistazo para ver si te sirve...

Saludos
Leo.
  #13 (permalink)  
Antiguo 21/03/2013, 13:12
 
Fecha de Ingreso: abril-2012
Mensajes: 11
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Select case

Hola, tenias toda la razon leonardo_josue esa simple consulta me arroja los resultados que yo deseo y funciona a la perfeccion asi como la explicaste y en verdad muchas gracias me estaba matando por algo muy muy simple gracias de verdad.

Etiquetas: select
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:42.