Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Concatenacion de caracteres de distintos registros (https://www.clubdelphi.com/foros/showthread.php?t=24336)

casandra 17-08-2005 03:07:25

Concatenacion de caracteres de distintos registros
 
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

Cita:

Empezado por casandra
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 encontré GROUP_CONCAT. De aquí a construir la sentencia SQL es un paso:

Código SQL [-]
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

Cita:

Empezado por Crandel
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

Cita:

Empezado por roman
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

Cita:

Empezado por Crandel
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

Dejenme comprar este pleito
 
o
Cita:

Empezado por roman
No 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

Cita:

Empezado por Migpal
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

Cita:

Empezado por roman
¿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:


La franja horaria es GMT +2. Ahora son las 10:05:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi