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 12-07-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Agrupar datos de una tabla

Hola a todos.

Tengo la siguiente estructura de datos de una tabla Firebird 1.5, en la que tengo un ID del recibo y los detalles de los mismos.

CREATE TABLE "RE0010DG"
(
"ID_REBUT" INTEGER NOT NULL,
"ID_ARBIT1" INTEGER,
"ID_ARBIT2" INTEGER,
"ID_ARBIT3" INTEGER,
"ID_ARBIT4" INTEGER,
"ID_ARBIT5" INTEGER,
"ID_ARBIT6" INTEGER,
"ID_ARBIT7" INTEGER,
"ID_ARBIT8" INTEGER,
"KM1" INTEGER,
"KM2" INTEGER,
"KM3" INTEGER,
"KM4" INTEGER,
"KM5" INTEGER,
"KM6" INTEGER,
"KM7" INTEGER,
"KM8" INTEGER,
"SOBRES_1" NUMERIC(9, 2),
"SOBRES_2" NUMERIC(9, 2),
"SOBRES_3" NUMERIC(9, 2),
"SOBRES_4" NUMERIC(9, 2),
"SOBRES_5" NUMERIC(9, 2),
"SOBRES_6" NUMERIC(9, 2),
"SOBRES_7" NUMERIC(9, 2),
"SOBRES_8" NUMERIC(9, 2),
"IMPORT_1" NUMERIC(9, 2),
"IMPORT_2" NUMERIC(9, 2),
"IMPORT_3" NUMERIC(9, 2),
"IMPORT_4" NUMERIC(9, 2),
"IMPORT_5" NUMERIC(9, 2),
"IMPORT_6" NUMERIC(9, 2),
"IMPORT_7" NUMERIC(9, 2),
"IMPORT_8" NUMERIC(9, 2),
"IMPORT_KM_1" NUMERIC(9, 2),
"IMPORT_KM_2" NUMERIC(9, 2),
"IMPORT_KM_3" NUMERIC(9, 2),
"IMPORT_KM_4" NUMERIC(9, 2),
"IMPORT_KM_5" NUMERIC(9, 2),
"IMPORT_KM_6" NUMERIC(9, 2),
"IMPORT_KM_7" NUMERIC(9, 2),
"IMPORT_KM_8" NUMERIC(9, 2),
"CAMPIONAT1" NUMERIC(9, 2),
"CAMPIONAT2" NUMERIC(9, 2),
"CAMPIONAT3" NUMERIC(9, 2),
"CAMPIONAT4" NUMERIC(9, 2),
"CAMPIONAT5" NUMERIC(9, 2),
"CAMPIONAT6" NUMERIC(9, 2),
"CAMPIONAT7" NUMERIC(9, 2),
"CAMPIONAT8" NUMERIC(9, 2),
"FEINER1" NUMERIC(9, 2),
"FEINER2" NUMERIC(9, 2),
"FEINER3" NUMERIC(9, 2),
"FEINER4" NUMERIC(9, 2),
"FEINER5" NUMERIC(9, 2),
"FEINER6" NUMERIC(9, 2),
"FEINER7" NUMERIC(9, 2),
"FEINER8" NUMERIC(9, 2),
"DOS_SECTORS1" NUMERIC(9, 2),
"DOS_SECTORS2" NUMERIC(9, 2),
"DOS_SECTORS3" NUMERIC(9, 2),
"DOS_SECTORS4" NUMERIC(9, 2),
"DOS_SECTORS5" NUMERIC(9, 2),
"DOS_SECTORS6" NUMERIC(9, 2),
"DOS_SECTORS7" NUMERIC(9, 2),
"DOS_SECTORS8" NUMERIC(9, 2),
"TOTAL_A1" NUMERIC(9, 2),
"TOTAL_A2" NUMERIC(9, 2),
"TOTAL_A3" NUMERIC(9, 2),
"TOTAL_A4" NUMERIC(9, 2),
"TOTAL_A5" NUMERIC(9, 2),
"TOTAL_A6" NUMERIC(9, 2),
"TOTAL_A7" NUMERIC(9, 2),
"TOTAL_A8" NUMERIC(9, 2),
"A1" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A2" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A3" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A4" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A5" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A6" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A7" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A8" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F1" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F2" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F3" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F4" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F5" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F6" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F7" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F8" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES
);

Necesitaria poder sacar los datos agrupados por ID_ARBITRE pero el problema es que el valor de este ID, puede estar en cualquiera de las ocho columnas posibles.

Vamos que lo que necesitaria es poder sacar todos los registros donde aparezca por ejemplo el valor del arbitro 1, algo así:

Arbitro 1

Recibo 1
Recibo 3
Recibo 5

Arbitro 2

Recibo 1
Recibo 2
Recibo 3

y sucesivamente, para sacar una hoja por cada arbitro.

El problema que tengo y que no se como solventar es que el valor del ID_ARBITRE = 1 puede estar tanto en ID_ARBITRE_1, ID_ARBITRE_2,ID_ARBITRE_3, ID_ARBITRE_4,ID_ARBITRE_5, ID_ARBITRE_6,ID_ARBITRE_7, ID_ARBITRE_8, pero solo una vez en cada recibo.

Luego todos los campos adicionales son los que tienen el mismo numero ID_ARBITRE_1 -> KM_1 -> TOTAL_1, etc.

No se si se debe usar algo de inner join o así.

Gracias por adelantado.

Josep
Responder Con Cita
  #2  
Antiguo 12-07-2012
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Bon dia xiquet.

Si te he entendido bien solo uno de los campos ID_ARBITRE_1, ID_ARBITRE_2, ID_ARBITRE_3, ... va a tener valor.

En ese caso puedes utilizar la función COALESCE(ID_ARBITRE_1, ID_ARBITRE_2, ID_ARBITRE_3, ....... ID_ARBITRE_8) que te va a devolver el ID del Árbitro asociado al registro (independientemente de en que campo se encuentre).

Puedes aplicar también COALESCE al resto de campos COALESCE(KM_1, KM_2, ....)

NOTA: Técnicamente lo que hace la función COALESCE es devolver el primer valor no nulo de la lista de valores que se le pase por parámetro.

Salut.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 13-07-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Gracias Marc.

Igual no me exprese bien.

Cita:
Si te he entendido bien solo uno de los campos ID_ARBITRE_1, ID_ARBITRE_2, ID_ARBITRE_3, ... va a tener valor.

No es así, pueden tener valores como mínimo 2 campos hasta los ocho, el problema es que el ID que busco puede estar situado según el recibo en cualquiera de los ocho ID, ejemplo:

recibo 1

ID_ARBITRE_1 = 1
ID_ARBITRE_2 = 2

RECIBO 2

ID_ARBITRE_1 = 3
ID_ARBITRE_2 = 1
ID_ARBITRE_3 = 8

RECIBO 3

ID_ARBITRE_1 = 2
ID_ARBITRE_2 = 1
ID_ARBITRE_3 = 5

con lo que deberia tener un resumen algo así:

Cabecera -> Resumen del arbitro ID =1

Recibo 1 + todos los campos con indice segun la posicion de ID_ARBITRE, es decir si esta en ID_ARBITRE_1, pues KM_1 , TOTAL_1 etc
Recibo 2 + todos los campos
Recibo 3 + todos los campos

Resumen arbitro 2

Recibo 1
Recibo 3

Resumen Arbitro 5

Recibo 3

Resumen Arbitro 8

Recibo 2

No se si así se entiende mejor

Yo pensaba en alguna consulta así como:

SELECT * FROM ID_ARBITRE_1 WHERE ID_ARBITRE = 1 (este valor es el que le pasare por parametro), más
SELECT * FROM ID_ARBITRE_2 WHERE ID_ARBITRE = 1 más
SELECT * FROM ID_ARBITRE_3 WHERE ID_ARBITRE = 1

así hasta el ID_ARBITRE_8

Esto es lo que no se como implementar

Saludos

Josep

Última edición por jafera fecha: 13-07-2012 a las 10:55:29. Razón: intentar aclarar más el razonamiento
Responder Con Cita
  #4  
Antiguo 13-07-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
A ver si avanzo algo he hecho esto y me salen los datos correctos:

Código SQL [-]
 
select ID_REBUT, ID_ARBIT1 from RE0010DG
INNER JOIN RE0001 ON ID_ARBIT1 = 1
GROUP BY ID_ARBIT1, ID_REBUT

Pero solo para una de las columnas de la tabla, ID_ARBIT1, puedo añadir más INNER o algo para que me busque en las otra siete columnas?

Tengo que hacer un select para cada una?.

Estoy más liado que la pata un romano.

Gracias

Josep
Responder Con Cita
  #5  
Antiguo 13-07-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Hola de nuevo.

Realmente lo que necesito es unir las consultas siguientes en una de sola y pudiendo cambiar el where id_arbit1 por id_arbit2, id_arbit3, etc... hasta el id_arbit8 por el valor del arbitro seleccionado.(parametro)

Código SQL [-]
 
select id_arbit1, id_rebut, import_1, sobres_1, import_km_1, campionat1, feiner1, dos_sectors1, total_a1 from re0010dg
where id_arbit1 = 1

select id_arbit2, id_rebut, import_2, sobres_2, import_km_2, campionat2, feiner2, dos_sectors2, total_a2 from re0010dg
where id_arbit2 = 1

select id_arbit3, id_rebut, import_3, sobres_3, import_km_3, campionat3, feiner3, dos_sectors3, total_a3 from re0010dg
where id_arbit3 = 1

select id_arbit4, id_rebut, import_4, sobres_4, import_km_4, campionat4, feiner4, dos_sectors4, total_a4 from re0010dg
where id_arbit4 = 1

select id_arbit5, id_rebut, import_5, sobres_5, import_km_5, campionat5, feiner5, dos_sectors5, total_a5 from re0010dg
where id_arbit5 = 1

select id_arbit6, id_rebut, import_6, sobres_6, import_km_6, campionat6, feiner6, dos_sectors6, total_a6 from re0010dg
where id_arbit6 = 1

select id_arbit7, id_rebut, import_7, sobres_7, import_km_7, campionat7, feiner7, dos_sectors7, total_a7 from re0010dg
where id_arbit7 = 1

select id_arbit8, id_rebut, import_8, sobres_8, import_km_8, campionat8, feiner8, dos_sectors8, total_a8 from re0010dg
where id_arbit8 = 1

Cada consulta por separado funciona perfectamente

Saludos

Josep
Responder Con Cita
  #6  
Antiguo 13-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Por qué no creas un procedimiento almacenado y le pasas el parámetro?
Responder Con Cita
  #7  
Antiguo 13-07-2012
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Curioso que nadie haya dicho que esa tabla no tiene ni pies ni cabeza.

No hay razón para tener 8 campos así.
Tampoco para almacenar los demás valores de esa forma.
Deben ser varias tablas.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 13-07-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Gracias por las respuestas.

Lepe:

No entiendo porque me dices esto, tal vez la estructura no sea la correcta, pero hace la funcion que yo quiero. Todos estos datos proceden de hacer un reparto según un importe cobrado y el número de arbitros que han intervenido.

Yo creo un recibo con el importe a cobrar, el numero de arbitros que actuan, el kilometraje de cada uno y empiezo a hacer el reparto que guardo en esta tabla, luego estos datos me sirven para imprimir el importe a cobrar por cada individuo sin errores.

Si tienes cualquier idea para mejorarla, pues encantado de la vida ya que como he comentado varias veces en el foro, yo no soy informatico de oficio, lo soy de oido como muchos músicos, que no saben leer una partitura pero encambio hacen sonar los instrumentos que te mueres.

Casimiro:

Podrías intentar encenderme alguna luz para ver si veo el final del tunel?
Es que el tema de los procedimeinetos está un poco oxidado, se que son potentes pero los he usado muy poco.

Saludos
Responder Con Cita
  #9  
Antiguo 13-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jafera Ver Mensaje


Código SQL [-]
select id_arbit1, id_rebut, import_1, sobres_1, import_km_1, campionat1, feiner1, dos_sectors1, total_a1 from re0010dg
where id_arbit1 = 1

select id_arbit2, id_rebut, import_2, sobres_2, import_km_2, campionat2, feiner2, dos_sectors2, total_a2 from re0010dg
where id_arbit2 = 1

select id_arbit3, id_rebut, import_3, sobres_3, import_km_3, campionat3, feiner3, dos_sectors3, total_a3 from re0010dg
where id_arbit3 = 1

select id_arbit4, id_rebut, import_4, sobres_4, import_km_4, campionat4, feiner4, dos_sectors4, total_a4 from re0010dg
where id_arbit4 = 1

select id_arbit5, id_rebut, import_5, sobres_5, import_km_5, campionat5, feiner5, dos_sectors5, total_a5 from re0010dg
where id_arbit5 = 1

select id_arbit6, id_rebut, import_6, sobres_6, import_km_6, campionat6, feiner6, dos_sectors6, total_a6 from re0010dg
where id_arbit6 = 1

select id_arbit7, id_rebut, import_7, sobres_7, import_km_7, campionat7, feiner7, dos_sectors7, total_a7 from re0010dg
where id_arbit7 = 1

select id_arbit8, id_rebut, import_8, sobres_8, import_km_8, campionat8, feiner8, dos_sectors8, total_a8 from re0010dg
where id_arbit8 = 1
¿Tienes que hacer las 8 consultas?
Responder Con Cita
  #10  
Antiguo 13-07-2012
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola Josep.

Cita:
Empezado por jafera Ver Mensaje
A ver si avanzo algo he hecho esto y me salen los datos correctos:
Código SQL [-]
select ID_REBUT, ID_ARBIT1 
from RE0010DG 
        INNER JOIN RE0001 ON ID_ARBIT1 = 1 
GROUP BY ID_ARBIT1, ID_REBUT


Pero solo para una de las columnas de la tabla, ID_ARBIT1, puedo añadir más INNER o algo para que me busque en las otra siete columnas?

Tengo que hacer un select para cada una?.

Estoy más liado que la pata un romano.

Gracias

Josep
Para añadir las otras siete columnas puedes usar la cláusula UNION, que permite unir varias consultas en una sola.

Es decir :

Código SQL [-]
  select id_arbit1, id_rebut, import_1, sobres_1, import_km_1, campionat1, feiner1, dos_sectors1, total_a1 from re0010dg
  where id_arbit1 = 1
UNION
  select id_arbit2, id_rebut, import_2, sobres_2, import_km_2, campionat2, feiner2, dos_sectors2, total_a2 from re0010dg
  where id_arbit2 = 1
UNION
  select id_arbit3, id_rebut, import_3, sobres_3, import_km_3, campionat3, feiner3, dos_sectors3, total_a3 from re0010dg
  where id_arbit3 = 1
UNION
  select id_arbit4, id_rebut, import_4, sobres_4, import_km_4, campionat4, feiner4, dos_sectors4, total_a4 from re0010dg
  where id_arbit4 = 1
UNION
  select id_arbit5, id_rebut, import_5, sobres_5, import_km_5, campionat5, feiner5, dos_sectors5, total_a5 from re0010dg
  where id_arbit5 = 1
UNION
  select id_arbit6, id_rebut, import_6, sobres_6, import_km_6, campionat6, feiner6, dos_sectors6, total_a6 from re0010dg
  where id_arbit6 = 1
UNION
  select id_arbit7, id_rebut, import_7, sobres_7, import_km_7, campionat7, feiner7, dos_sectors7, total_a7 from re0010dg
  where id_arbit7 = 1
UNION
  select id_arbit8, id_rebut, import_8, sobres_8, import_km_8, campionat8, feiner8, dos_sectors8, total_a8 from re0010dg
  where id_arbit8 = 1

Salut
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #11  
Antiguo 13-07-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Salut Marc.

Has dado en el clavo, esto es lo que yo no acababa de interpretar UNION, con esto me devuelve los registros tal y como los quiero

Muchas gracias

Josep

Edito:

Si pongo where ID_ARBIT1 =:ARBITRE, este parametro me puede servir para todas las demas clausulas where?, es decir ID_ARBIT2=:ARBITRE, etc.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como agrupar datos por semanas flystar MySQL 1 06-06-2008 04:52:32
Problema en agrupar datos en QuickReport enecumene Impresión 15 07-11-2007 19:02:52
Agrupar o no según u parametro de una tabla auxiliar apicito SQL 8 28-12-2004 00:44:41
Agrupar datos castroruiz2001 SQL 3 04-07-2003 19:14:06
Como agrupar datos de una tabla dabas Impresión 1 05-06-2003 17:20:47


La franja horaria es GMT +2. Ahora son las 01:06:36.


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