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)
-   -   Problemas al Agrupar por un campo COMPUTED BY (https://www.clubdelphi.com/foros/showthread.php?t=86766)

hecospina 30-09-2014 05:39:43

Problemas al Agrupar por un campo COMPUTED BY
 
Hola

Hace tiempo que no ingresaba al foro
Un saludo para todos

Tengo instalado Firebird 2.5 32 bits en mi equipo
Se realizo una actualizacion de la aplicacion con la que accedo a la base de datos y me surgio un problema, los sql que tenia en mis consultas con la clausula Group by dejaron de realizar la agrupacion, despues de revisar encontre que cuando adiciono al grupo un campo "Computed by" se pierde la agrupacion

Este SQL me deberia devolver los datos agrupados por documento
Código SQL [-]
select factura,nombre_cliente,sum(valor) as valor
from tabla
group by factura,nombre_cliente
1345,JUAN PEREZ,100.000
1346,PEDRO PEREZ,230.000
1347,MARIA PEREZ,45.000

Pero me regresa los datos sin agrupar

1345,JUAN PEREZ,60.000
1345,JUAN PEREZ,20.000
1345,JUAN PEREZ,20.000
1346,JUAN PEREZ,200.000
1346,JUAN PEREZ,10.000
1346,JUAN PEREZ,20.000
1347,JUAN PEREZ,45.000

si cambio el query haciendo trim al campo computed by funciona correctamente
Código SQL [-]
select factura,trim(nombre_cliente) as nombre_cliente,sum(valor) as valor
from tabla
group by factura,trim(nombre_cliente)
La base de datos no se ha desinstalado ni modificado la configuracion

La solucion es simple, hacer el trim a todos los campos, el problema es que tengo muchos reportes

Quedo atento a su ayuda

Muchas gracias

ecfisa 30-09-2014 08:05:29

Hola hecospina.

Para quitar los espacios y evitar el uso de TRIM en la consulta podes hacer:
Código SQL [-]
UPDATE TABLA
SET NOMBRE_CLIENTE = TRIM(NOMBRE_CLIENTE)
y luego modificar el programa para que realize TRIM antes de cada guardado.

Pero... con eso no se soluciona la cosa. TRIM eliminará los espacios a la derecha e izquierda, pero el usuario podría por ejemplo, poner dos espacios entre el nombre y apellido (o equivocarse una letra al escribir). Y en esos casos GROUP BY tampoco agrupará dichos valores por ser distintos.

Lo ideal sería que reemplazaras la columna NOMBRE_CLIENTE por el identificador único de cliente correspondiente a la tabla clientes, de ese modo no habría equívoco posible:
Código SQL [-]
CREATE TABLE TABLA (
    ...
    CLIENTE_ID  INTEGER,  /* ID (cliente) */
    ...
);
Los valores de las columnas se verían parecido a esto:
Código:

FACTURA        VALOR        CLIENTE_ID
1345        60        1          (JUAN PEREZ)
1345        20        1
1345        20        1
1346        80        2          (OTRO CLIENTE)

Y la consulta equivalente sería:
Código SQL [-]
SELECT T1.FACTURA, T2.NOMBRE_CLIENTE, SUM(T1.VALOR) AS VALOR
FROM TABLA T1
INNER JOIN CLIENTES T2 ON T1.CLIENTE_ID = T2.ID
GROUP BY T1.FACTURA, T2.NOMBRE_CLIENTE
Ahora poco importa si en la tabla de clientes a JUAN PEREZ lo ingresaron con espacios, o como JUAN PERES, etc., ya que siempre se tratará del mismo contenido y por lo tanto se agrupará.

Ha... por cierto, no olvides de poner las etiquetas [sql] ... [/sql] a tu código SQL (ya las agregué en tu mensaje)

Saludos :)

hecospina 30-09-2014 16:08:41

Muchas gracias Daniel

Por tratarse de un campo computed by no es posible realizar el update

Efectivamente la tabla de terceros tiene la llave primaria y el campo nombre es el resultado de unir el primer nombre, el segundo nombre, el primer apellido y el segundo apellido

La consulta la genero haciendo el join a esta tabla

Gracias


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

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