Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-08-2005
casandra casandra is offline
Registrado
 
Registrado: jul 2004
Ubicación: Tierra del Fuego
Posts: 4
Poder: 0
casandra Va por buen camino
Question 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....
Responder Con Cita
  #2  
Antiguo 17-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 17-08-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
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.
__________________
[Crandel]
Responder Con Cita
  #4  
Antiguo 17-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 17-08-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
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
__________________
[Crandel]
Responder Con Cita
  #6  
Antiguo 17-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 17-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 17-08-2005
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 288
Poder: 22
kalimero Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 17-08-2005
Migpal Migpal is offline
Miembro
 
Registrado: jul 2005
Ubicación: Colombia
Posts: 91
Poder: 19
Migpal Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 17-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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?

Se me hace que

roman 1 - Migpal 0



// Saludos
Responder Con Cita
  #11  
Antiguo 17-08-2005
Migpal Migpal is offline
Miembro
 
Registrado: jul 2005
Ubicación: Colombia
Posts: 91
Poder: 19
Migpal Va por buen camino
Cita:
Empezado por roman
¿Y quién ha dicho que MySql no puede usar índices?
// 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

Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:35:08.


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
Copyright 1996-2007 Club Delphi