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

Campos concatenados

Estas en el tema de Campos concatenados en el foro de Mysql en Foros del Web. Hola, tengo que concatenar tres campos, ya lo hice pero estos campos tienen una característica especial, representan un id_provincia dos digitos, id_dpto originalmente está así ...
  #1 (permalink)  
Antiguo 12/11/2011, 11:42
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Miguel de Tucumán
Mensajes: 13
Antigüedad: 17 años, 6 meses
Puntos: 0
Campos concatenados

Hola, tengo que concatenar tres campos, ya lo hice pero estos campos tienen una característica especial, representan un id_provincia dos digitos, id_dpto originalmente está así por ej. 7 o 14 o 21, pero necesito que sea de tres dígitos o sea, 007, 014, 021. Con el último pasa lo mismo.
Necesito que llene con ceros para completar los tres dígitos porque contatenados tiene que quedar un código así:
90007012.
Alguna idea? Gracias
  #2 (permalink)  
Antiguo 12/11/2011, 11:48
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: Campos concatenados

LPAD(). Busca su forma de uso en el manual.
Básicamente es LPAD(nombreCampo, cantidadCaracteres, 'caracter')
En combinación con RPAD() o CONCAT te dará lo que necesitas:
Código MySQL:
Ver original
  1. mysql> SELECT LPAD(98,6,'0') NUMERO;
  2. +--------+
  3. | NUMERO |
  4. +--------+
  5. | 000098 |
  6. +--------+
  7. 1 row in set (0.00 sec)
Usando RPAD(), LPAD() y CONCAT():
Código MySQL:
Ver original
  1. mysql> SELECT CONCAT(RPAD(9,6,'0'), LPAD(71,4,'0')) NUMERO;
  2. +------------+
  3. | NUMERO     |
  4. +------------+
  5. | 9000000071 |
  6. +------------+
  7. 1 row in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/11/2011, 12:01
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Miguel de Tucumán
Mensajes: 13
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Campos concatenados

Eso sería para un número específico? porque cada id tiene un número distinto que cambia según el departamento o fracción censal
  #4 (permalink)  
Antiguo 12/11/2011, 14:06
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: Campos concatenados

¿Por qué no lo analizas y lo intentas?
Lo que yo te estoy poniendo es una forma de usar ciertas funciones numèricas... El resto depende de cómo lo implementes.

Consulta el manual, haz las pruebas y me cuentas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/11/2011, 15:13
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Miguel de Tucumán
Mensajes: 13
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Campos concatenados

Gracias.
Te hago otra pregunta, tengo esta consulta:

SELECT Todas.IdProvincia, Todas.id_dpto, Todas.Frac, Round(((Sum(Todas.Urea)/Sum(Todas.Caña))*100),1) AS PorcUrea, Todas.UreayCachaz, Todas.ComFosforo, Sum(Todas.Caña) AS SumaDeCaña, Sum(Todas.Urea) AS SumaDeUrea
FROM Todas
GROUP BY Todas.IdProvincia, Todas.id_dpto, Todas.Frac, Todas.UreayCachaz, Todas.ComFosforo;

En algunos registros hay 0 para sumar y la división da #Error, lo que es lógico porque no se puede dividir nada en nada, cómo hago para que no tenga en cuenta las sumas en cero?
  #6 (permalink)  
Antiguo 12/11/2011, 16:47
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: Campos concatenados

Es un problema habitual. Todos lo hemos debido resolver en algún momento y en realidad es fácil: usas IFNULL() para forzar el resultado al valor correcto, que en ese caso sería 1:
Código MySQL:
Ver original
  1.     T.IdProvincia,
  2.     T.id_dpto,
  3.     T.Frac,
  4.     ROUND(((SUM(T.Urea)/IFNULL(SUM(T.Caña), 1))*100),1) PorcUrea,
  5.     T.UreayCachaz,
  6.     T.ComFosforo,
  7.     Sum(T.Caña) SumaDeCana,
  8.     Sum(T.Urea) SumaDeUrea
  9.     Todas T
  10.     T.IdProvincia,
  11.     T.id_dpto,
  12.     T.Frac,
  13.     T.UreayCachaz,
  14.     T.ComFosforo;
Un par de consejos:
- No uses caracteres extendidos como eñes, letras acentuadas o símbolos en los nombres de las columnas, tablas o bases. Por más que el sistema aparentemente te los acepte, o las interfases como phpMyadmin te las acepten, te traerán problemas luego cuando las uses codificando la aplicación.
- No es necesario usar los nombres completos de las tablas cuando invocas a una sola en el FROM, y puedes simplificarlas usando ALIAS.
__________________
¿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; 12/11/2011 a las 16:59
  #7 (permalink)  
Antiguo 12/11/2011, 17:00
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Miguel de Tucumán
Mensajes: 13
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Campos concatenados

Gracias, todo me sirvió muchísimo. Mil gracias.
Lo de los caracteres extendidos los puse por error, a una le sale escribir con cierta corrección española, lástima que los sistemas no funcionan así
  #8 (permalink)  
Antiguo 12/11/2011, 18:26
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Miguel de Tucumán
Mensajes: 13
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Campos concatenados

Una nueva consulta. Utilizando la sentencia CONCAT, genero una consulta y quiero agregar el producto de esa consulta a un campo de una tabla que ya existe, cómo hago?
  #9 (permalink)  
Antiguo 12/11/2011, 23:23
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: Campos concatenados

CONCAT no es una sentencia, sino una función (un conjunto de operaciones con nombre, que puede contener parámetros y que devuelve un resultado). En este caso es una función que combina varias cadenas de texto en una sola.
Sabiendo eso, ¿podrías explicar mejor y mostrar a qué te refieres con "producto" de CONCAT()?

Muestranos lo que estás intentando...
__________________
¿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 13/11/2011, 08:59
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Miguel de Tucumán
Mensajes: 13
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Campos concatenados

Te cuento con un poco más de detalles. Necesito generar en la base de datos que ya tengo, un nuevo campo que concantene los campos que corresponden a provincia, departamento y fracción censal. Este nuevo campo es necesario para unir con otra tabla con representación geográfica que ya tiene estos códigos y corresponden a un shape de gvSIG. Teniendo este campo para unir, ya puedo generar el sistema de información que necesito para procesar un censo y representarlo geográficamente
  #11 (permalink)  
Antiguo 13/11/2011, 10:01
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: Campos concatenados

A ver si entiendo:
- En la tabla donde tienes la representación geográfica, el código que representa provincia+departamento+fraccion censal es un sólo campo.
- La tabla que contiene provincia, departamento y fraccion censal son tres campos.
- Necesitas relacionar ambas tablas...
¿es así?
__________________
¿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 13/11/2011, 10:23
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Miguel de Tucumán
Mensajes: 13
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Campos concatenados

Así es, tal cual. Pero necesito ese código para unificar un criterio en todas las tablas que vendrán porque por ahora el trabajo es sobre una sola provincia, pero hay que generalizarlo a todos los resultados. El código que tiene la tabla geográfica es algo así 90007012, los primeros dos son la provincia, los siguientes tres dígitos el departamento y los tres restantes la fracción censal. Con la salvedad de que originalmente departamento y fracción no están en tres dígitos por eso pregunté cómo hacer.
  #13 (permalink)  
Antiguo 13/11/2011, 11:17
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: Campos concatenados

Sigue sin ser necesario crear el campo. En todo caso lo puedes manejar en la consulta:
Código MySQL:
Ver original
  1. SELECT A.*, B.*
  2. FROM FraccionCensal A,  TablaShapes B
  3. WHERE CONCAT(LPAD(A.id_pcia, 2, '0'), LPAD(A.id_dpto, 3, '0'), LPAD(A.id_fraccioncensal, 3, '0')) = B.id_shape;
Habría que probar:
Código MySQL:
Ver original
  1. SELECT A.*, B.*
  2. FROM FraccionCensal A INNER JOIN TablaShapes B ON
  3.     CONCAT(LPAD(A.id_pcia, 2, '0'), LPAD(A.id_dpto, 3, '0'), LPAD(A.id_fraccioncensal, 3, '0')) = B.id_shape;
porque el WHERE no es optimizable por el parser, y el FROM sí, pero nunca he probado usar estas funciones en él.
Personalmente definiría una VIEW sobre la base de este tipo de consultas porque luego es más sencillo de invocarla, y siempre estará actualizada.

Ten en cuenta siempre que no es buena práctica agregar columnas a una tabla con el único objetivo de presentar la misma información que ya existe con otro formato. Lo pagas con performance y consistencia, por todos lados.

De todos modos, si aún así quieres hacer lo que dices, consiste en la ejecución de dos sentencias: Un ALTER TABLE para agregar la columna, la cual aconsejo que sea del mismo tipo y longitud que la de la otra tabla, y un UPDATE donde asignes a esa nueva columna el resultado del CONCAT() que te pongo en esos ejemplos, sin condiciones WHERE, para que procese todos los registros.
En realidad, es una tarea simple, pero luego tienes que tener cuidado con la consistencia de datos, porque cualquier cambio en los registros requerirá volver a ejecutar el UPDATE en cuestión.

¿Se entiende la idea?
__________________
¿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; 13/11/2011 a las 16:09

Etiquetas: 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 19:27.