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

ordenar campo precio varchar

Estas en el tema de ordenar campo precio varchar en el foro de Mysql en Foros del Web. buenas, tengo una base de datos y quiero ordenar por precio. tengo el campo definido como varchar en la bd, y tengo valores tal que ...
  #1 (permalink)  
Antiguo 03/06/2010, 15:57
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
ordenar campo precio varchar

buenas,

tengo una base de datos y quiero ordenar por precio. tengo el campo definido como varchar en la bd, y tengo valores tal que asi: 750.000, 500.000, 1.000.000....

y claro, cuando quiero ordenar no me hace caso. me podeis aconsejar como hacerlo?

[MYSQL]
... WHERE precio > 500.000 ....

[/MYSQL]

alguna sugerencia?

saludos!
  #2 (permalink)  
Antiguo 03/06/2010, 16:37
 
Fecha de Ingreso: diciembre-2008
Ubicación: Perú
Mensajes: 20
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: ordenar campo precio varchar

Debes de convertir:
where cast(precio as Decimal(10,2))>500.00
  #3 (permalink)  
Antiguo 03/06/2010, 17:22
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: ordenar campo precio varchar

No va a poder convertirlo a DECIMAL, porque ha usado un VARCHAR para poder guardar el valor con separadores de miles, cosa que no se debe hacer jamás.
Debió usar un campo DECIMAL; ahora, para poder ordenar los valores primero tiene que expurgarlos de basura (los separadores), reemplazar la coma por el punto, si la usó, y recién allí podrá convertir el valor para ordenarlo.
Es un error, producto de suponer que los valores numéricos se almacenan como cifras, cuando en realidad se almacenan como binarios.
Te conviene realizar la conversión de la columna a un tipo DECIMAL, para poder tener el valor un formato compatible con todos los sistemas. Eso, antes de preocuparse por ordenar...
Quedaría algo así:
Código MySQL:
Ver original
  1. SELECT CAST(REPLACE(REPLACE('500.000,23','.', ''),',','.') AS DECIMAL(20,2)) PRECIO
Lo que sería muy engorroso, para aplicarlo cada vez que debas modificar los dirty data que tienes en la base.

El problema de representar un valor '500000.23', como '500.000,23', es un asunto que se resuelve en la consulta, o bien en la interfase, y no usando un tipo de campo que no corresponde (y que además termina necesitando más espacio de disco).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/06/2010 a las 21:16
  #4 (permalink)  
Antiguo 04/06/2010, 02:15
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: ordenar campo precio varchar

buenas y gracias a los 2!!!

estoy a tiempo de modificar el dato, hace poco que empece la base de datos y el campo precio está por rellenar. que me recomendais, un decimal? como haria el select entonces?

y a la hora de insertarlo des de la intranet, se puede insertar tal cual, es decir, 500.000, 760.000, 1.900.000....?

saludos y gracias!
  #5 (permalink)  
Antiguo 04/06/2010, 05:13
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: ordenar campo precio varchar

El manual de MySQL recomienda usar DECIMAL para los casos de valores con decimales que requieran precisión, como es el caso de valores monetarios.
En ese caso lo que tienes que determinar es la cantidad de dígitos enteros y decimales que usarás, ya que el DECIMAL requiere indicar la longitud del valor mayor (incluyendo el punto o coma decimal) y la cantidad de decimales a usar.
Así, DECIMAL(l, d), indicado como
Código MySQL:
Ver original
  1. DECIMAL(12,2)
significa que el mayor entero posible será 999999999, y el rango máximo será de -999999999.99 a 999999999.99.
Si cuentas los "9", verás que hay sólo 11, mientras que estoy indicando 12 como longitud de campo. Eso es porque un byte se usa para indicar la posición del punto decimal.

Respecto a la representación de los valores en pantalla, eso depende del lenguaje usado. En VB.Net, por ejemplo, eso se puede realizar por medio de objetos Globalization.CultureInfo, dos de cuyas propiedades permiten indicar qué separador decimal y de miles se usarán.

Fíjate en el método indicado en el manual de referencia en tu lenguaje de programación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 04/06/2010, 08:37
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: ordenar campo precio varchar

buenas,

he modificado el campo decimal tal y como indicabas, precio Decimal(2,0). me ha modificado los valores, y donde tenia por ejemplo 760.000 me ha puesto 760. de que forma ahora modifico ese valor? al ponerle . o , no me modifica. que hago mal?

saludos!
  #7 (permalink)  
Antiguo 04/06/2010, 11:15
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: ordenar campo precio varchar

No te percataste de que te dije que para hacer la conversión debías primero usar esta forma:
Código MySQL:
Ver original
  1. CAST(REPLACE(REPLACE(precio,'.', ''),',','.') AS DECIMAL(20,2))
porque lo que tienes son datos sucios (dirty data), producto de ingresar un datos en un formato incorrecto.

El punto, en las bases de datos, es el separador de decimales y no de miles, por lo que te está cortando el valor donde se supone que es correcto (de hecho, el punto no existe desde la óptica del binario, sino que es una forma codificación que el DBMS "reconstruye" cuando consultas).
El asunto es que antes de hacer la conversión del campo a DECIMAL, primero tienes que corregir el dato guardado. Esto se hace:
Código MySQL:
Ver original
  1. UPDATE tabla
  2. SET precio CAST(REPLACE(REPLACE(precio,'.', ''),',','.') AS DECIMAL(20,2));
Y recién allí puedes cambiar el tipo de columna...
__________________
¿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 07/06/2010, 10:09
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: ordenar campo precio varchar

gracias gnzsoloyo

he probado a hacer el update de la table y me da el siguiente error:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'CAST(REPLACE(REPLACE(precio,'.', ''),',','.') AS DECIMAL(20,2))

que hago mal?

saludos!
  #9 (permalink)  
Antiguo 07/06/2010, 10:14
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: ordenar campo precio varchar

Código MySQL:
Ver original
  1. UPDATE tabla
  2. SET precio = CAST(REPLACE(REPLACE(precio,'.', ''),',','.') AS DECIMAL(20,2));
¿Estaba sin el "="?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 07/06/2010, 11:09
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: ordenar campo precio varchar

me sigue dando error: yo ejecuto:

UPDATE viviendas_esp
SET precio = CAST(REPLACE(REPLACE(precio,'.', ''),',','.') AS DECIMAL(20,2))

y me devuelve

MySQL ha dicho:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECIMAL(20,2))' at line 2

saludos
  #11 (permalink)  
Antiguo 07/06/2010, 11:31
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: ordenar campo precio varchar

Lo siento, el CAST no iba en este caso...

Fase 1: Normalizar los valores:
Código MySQL:
Ver original
  1. UPDATE viviendas_esp
  2. SET precio = REPLACE(REPLACE(precio, '.', ''), ',', '.') ;
Fase 2: Modificar el tipo de columna.
Código MySQL:
Ver original
  1. ALTER TABLE viviendas_esp MODIFY COLUMN precio decimal(20,2);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 07/06/2010, 12:57
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: ordenar campo precio varchar

lo sientes!! no te disculpes faltaria mas!!!

una cosa solo. ahora en donde tenia insertado en el varchar, 1.100.000 tengo lo siguiente 1100000.00. esa es la forma correcta en la que hay que insertarlo en la bd?

y de que forma tengo que parsearlo en el xp?

saludos!
  #13 (permalink)  
Antiguo 07/06/2010, 13:31
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: ordenar campo precio varchar

Ese es el formato correcto.
Para darte alguna indicación, necesitaría que me dijeses qué lenguajes estás usando para la aplicación.
Como adelanto, en SQL, si quisieras modificar un valor, la sintaxis quedaría:
Código MySQL:
Ver original
  1. UPDATE viviendas_esp
  2. SET precio = 125486.38
  3. WHERE vivienda_id = 1253;
Como podrás ver, el tema es que los valores numéricos no van entre apostrofes, y los decimales se representan con el punto.
Todo el resto es responsabilidad de las interfaces gráficas, y es allí donde se resuelve. Pero para darte algún consejo más, necesitaría saber con qué estás trabajando.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 10/06/2010, 10:01
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: ordenar campo precio varchar

buenas gnzsoloyo,

estoy trabajando con php. y claro, ahora con lo que hicimos se muetsra el dato en pantalla tal que asi: precio:750000, y me gustaria formatear ese valor a 750.000 aunque en la bd para poder hacer el orden correctamente este como indicas!

saludos y gracias por tus molestias!
  #15 (permalink)  
Antiguo 10/06/2010, 10:26
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: ordenar campo precio varchar

En el caso de PHP, hay una clase que maneja eso NumberFormatter.
En esa página vas a encontrar los casos específicos, que en tu tema sería NumberFormatter::formatCurrency
Allí vas a encontrar los ejemplos que necesitas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: precio, varchar, campos
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 20:45.