PDA

Ver la Versión Completa : Concatenacion de caracteres de distintos registros


casandra
17-08-2005, 03:07:25
Supongamos que esta es la tabla (creada con el ibexpert)
Si, aparentemente es medio particular lo que estoy necesitando. Intentaré darles un ejemplo más visual.

Si esta fuera mi tabla:
CODIGOPAIS EMPRESA CATEGORIA
01 Cyutan S.A. NL
01 Ayel S.R.L. TT
01 Cocuyo S.R.L. PP
01 Entre Rios S.A. NL
01 Conteniente NL
01 AustralTur TT
03 Apolos S.A. PP
03 Contruye S.R.L. PP
03 Pampeano S.A. NL
03 Cruz del Sur TT
05 El Cruceño NL

Lo que quiero lograr de resultado de mi consulta SQL es:
CODIGOPAIS CATEGORIAS
01 NL - TT - PP - NL - NL - TT
03 PP - PP - NL - TT
05 NL

Queda claro que el group es por CODIGOPAIS. ¿Pero como logro que todas las categorias me queden en un campo?

Espero me haya sabido explicar, y que conozcan una manera (si la hay) yo ya me rebane los cesos con todas las ayudas y libros de los que dispongo aqui abajo (Tierra del Fuego , Argentina). y no encontre nada.

Gracias por la ayuda....

roman
17-08-2005, 04:45:09
aparentemente es medio particular lo que estoy necesitando


Esto podría ser síntoma de que algo está fallando en el diseño de las tablas. La solución no necesariamente radica en cómo ha de ser la consulta SQL sino posiblemente en una restructuración del modelo.

De cualquier manera, como dices, es claro que la agrupación debe hacerse por el campo CODIGOPAIS y sobre cada grupo debes aplicar una función. Este tipo de funciones son las llamadas funciones agregadas (aggregate functions), así que el primer paso sería consultar la documentación del motor de datos que uses para ver de cuáles funciones agregadas dispone.

Esto es justamente lo que acabo de hacer; no con Interbase pues no lo uso, sino con MySql, y en la lista de funciones agregadas (http://dev.mysql.com/doc/mysql/en/group-by-functions.html) encontré GROUP_CONCAT. De aquí a construir la sentencia SQL es un paso:


select codigopais, group_concat(categoria)
from tabla
group by codigopais


Así que consulta la documentación a ver si hay alguna función agregada similar.

// Saludos

Crandel
17-08-2005, 07:35:10
la verdad es que no conozco que exista algo tan sencillo para concatenar (puede llegar a existir alguna UDF).

El operador de concatenación es el ||

Esta operación es un poco mas compleja dado que deberias crearte un procedimiento almacenado (SP), e ir generando el capo que queres con un siclo for.

Bastante más complejo. :(

no conozco una forma simple, no significa que no exista, busca si hay alguna UDF que lo haga mas sencillo, sino ... tampoco es para morirse, se puede crear.

roman
17-08-2005, 07:39:23
la verdad es que no conozco que exista algo tan sencillo para concatenar

[...]

Bastante más complejo. :(


MySql 1 - Firebird 0

;)

// Saludos

Crandel
17-08-2005, 08:25:37
funciones agregadas encontré GROUP_CONCAT

pero facilmente se podría crear una UDF que resuelva el problema y usarlo como en MySQL.

En MySQL tambien es una función agregada, la unica diferencia es que ya la programo alguien y la encontraste y yo no. mientras tanto

MySql 1/2 - Firebird 0

roman
17-08-2005, 08:31:44
En MySQL tambien es una función agregada, la unica diferencia es que ya la programo alguien y la encontraste


No exactamente. En MySql la función es una función nativa, tal como SUM o COUNT.

MySql 3/4 - Firebird 0

;)

EDITO:

Quizá es que hay una confusión. Por "agregada" no me refiero a una función que se agrega, tal como una UDF, sino a las funciones así llamadas que se aplican sobre grupos.

// Saludos

roman
17-08-2005, 08:38:20
Retomando el tema luego de esta pequeña disgresión, a mi me interesaría conocer un poco más del contexto de una consulta SQL como la deseada.

Insisto que me suena rara, que si existe una necesidad de algo así quizá se deba a un esquema de tablas algo "raro". Aunque el campo obtenido es a fin de cuentas un campo calculado, no deja de ser un campo cuyos valores son listas, hecho que va contra la primera forma normal ¿no es así?

// Saludos

kalimero
17-08-2005, 18:05:27
Hola.
Bueno, el tema que plantea casandra me resulta familiar. Efectivamente como indica Román no parece que sea un modelo de datos demasiado ortodoxo cuando se intenta hacer una consulta de este tipo. Hay que verlo desde otro punto de vista, es decir, posiblemente estes intentando explicarnos como muestro el resultado de la consulta al usuario final. Yo tuve (y tengo ) el mismo problema. El responsable de mi departamento quiere una presentacion de datos 'al reves' similar al ejemplo planteado. Hay dos formas de solucionar el problema:
1.- Ejecutas la consulta 'como dios manda' y despues le das la vuelta por codigo para presentarla en tu interface

2.- Utilizas componentes especificos para ello (xQuery, que es el que en su dia utilice) que realizan el trabajo sucio de coger los resultados de una consulta y darles la vuelta.

Saludos

Migpal
17-08-2005, 19:38:19
oNo exactamente. En MySql la función es una función nativa, tal como SUM o COUNT.

MySql 3/4 - Firebird 0

// Saludos
Bueno, si asi fuera al no usar indices por el campo categoria Mysql se tardaria un buen tiempo en traer datos. si no esta en firebird dicha funcion es porque alli se respeta el perfomarce antes de hacer facil las cosas a los usuarios.

Firebird 1 - MySql 0

En estos casos recomiento hacer el formato de los datos para presentarlos directamente en el front-end.
;)

roman
17-08-2005, 20:03:48
al no usar indices por el campo categoria Mysql se tardaria un buen tiempo en traer datos.


¿Y quién ha dicho que MySql no puede usar índices? :confused:

Se me hace que

roman 1 - Migpal 0

:D

// Saludos

Migpal
17-08-2005, 20:19:03
¿Y quién ha dicho que MySql no puede usar índices? :confused:
// Saludos
UPSSSSS, indices como..... insertar al final de la tabla?, ha duras penas pudieron implementar una estructura innoBD para sustentar indices foraneos, no me imagino el codigo para hacer un cluster cuando la filosofia es facil inserción...

MySql=0
Firebird=1/2
Roman=Fuera de Concurso

:cool: