PDA

Ver la Versión Completa : Sumar campo con Puntos y Comas


sevenapp
27-08-2016, 03:25:10
Buenas.
Necesito sumar los valores de un campo de una base de datos, pero el mismo es de tipo character varying.
como ide estoy usando Lazarus.

intento usando la función sum() pero es para datos numéricos.

Las opciones que tengo son:

1- cambiar el tipo de datos en la db. (El campo es character varying porque contiene números, Punto y Coma)
ej: 2,345.56
desconozco si en postgres hay algún tipo de datos que los contenga y se pueda sumar.

el resultado por medio de un datasource y una Zquery los quiero mostrar en un DBtext o un Label.

Espero su ayuda!!!

Casimiro Notevi
27-08-2016, 10:18:34
¿De quién fue la idea de guardar números como texto? :confused::confused::confused:
Créate un nuevo campo numérico, pasa los datos convertidos a ese nuevo campo.
Luego borras el campo de texto y renombras el nuevo numérico con el nombre que tenía el viejo de texto.

sevenapp
27-08-2016, 16:47:29
La tabla se crea importando datos de un txt.

El problema es que me da un error al crear la tabla con el campo numérico.
Por lo q entiendo es porq el valor tiene puntos y comas. Un mismo valor tiene un punto y una coma.
Eh: 3,634.89

Casimiro Notevi
27-08-2016, 17:09:05
Pues claro que da error, como tiene que ser :)
¿De quién fue la idea de guardar números como texto? :confused::confused::confused:
Créate un nuevo campo numérico, pasa los datos convertidos a ese nuevo campo.
Luego borras el campo de texto y renombras el nuevo numérico con el nombre que tenía el viejo de texto.

sevenapp
27-08-2016, 17:55:02
Soy nuevo con esto.
"Pasar los datos" a que te referis?

el campo numérico no me acepta datos con ese formato.

cree una tabla nueva con un campo id y un campo numérico y intente cargar un valor asi: 2,567.43 y me da error.

todo lo que necesito es definir el campo para que acepte ese tipo de valores.

ecfisa
27-08-2016, 17:58:40
Hola.

Agregando algo a lo sugerido por Casimiro, para eliminar esa ',' que te dificulta la conversión, podes hacer:

UPDATE LA_TABLA
SET EL_CAMPO = SUBSTRING(EL_CAMPO FROM 1 FOR POSITION(',', EL_CAMPO) - 1) ||
SUBSTRING(EL_CAMPO FROM POSITION(',', EL_CAMPO) + 1 FOR CHAR_LENGTH(EL_CAMPO))

El código está probado pero como siempre, te aconsejo hacer un resguardo de la tabla antes de ejecutarlo (reemplazá "LA_TABLA" y "EL_CAMPO" por los nombres que corresponda).

Saludos :)

ecfisa
27-08-2016, 18:18:13
Hola de nuevo.

Acabo de leer que PostgreSQL tiene la función OVERLAY (http://www.w3resource.com/PostgreSQL/overlay-function.php) que podría simplificar la sentencia si soportara cadena vacía en su segundo parámetro...
Pero no puedo probarlo por que no tengo PostgreSQL aquí.

Saludos :)

sevenapp
27-08-2016, 18:23:30
Gracias.

No hay una forma de que el campo acepte esos valores del ejemplo?
porque la db es usada por varios sistemas y cambiar los valores del campo puede afectar a otros sistemas que no tengo acceso.

los valores varian, a veces tienen punto y coma, y a veces no ej:

Costo
3,456.23
345.67
8,678.35
34.67

el sistema lo estoy desarrollando en el ide de codeTyphon con la conexión por Zeos.

Explico un poco mas como funciona.

1 - Tomo un archivo txt con los datos.
2 - Creo una tabla para guardar los valores del archivo
3 - Importo los datos del txt a la tabla

Acá el problema. en todas las pruebas, si el campo es numérico sale un error al importar los datos.
Y el segundo problemas, es que la tabla la usan otros sistemas y requieren que el campo contenga los datos con el formato del ejemplo.
Y el tercer problema es que no puedo sumar los valores del campo por no ser numérico :D

Por eso se me había ocurrido cambiar el tipo de campo pero manteniendo el formato de los valores.

Espero se entienda.

Gracias por las sugerencias!

mamcx
27-08-2016, 18:44:25
Guardar numeros como texto es un error garrafal, pero ssi es cierto que otros sistemas dependen de ese error y no puedes correjirlos (que seria lo correcto y aun con la ideas que te den deberias hacerlo, sin dudar), hay 2 formas de hacerlo.

La primera y obvia es ir convirtiendo cada valor en cada consulta que lo necesites. La otra es crear una columna extra, como

Valor_MALHECHOENTEXTO Varchar
Valor_COMODEBESER Numeric


Y creas un trigger que haga la conversion al guardar, y sigues solo usando la columna correcta en tu app (mientras las otras se migran).

Ahora bien, si esa tabla es solo para importar datos y luego transpasar a otras, entonces usas la primera version solamente.