Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-04-2004
lledesma lledesma is offline
Miembro
 
Registrado: abr 2004
Posts: 43
Poder: 0
lledesma Va por buen camino
Question Consulta para reportes

Hola a todos:

Mi consulta es la siguiente:
Tengo una tabla cuya estructura es la siguiente:

Idcliente detalle importe
1 concepto1 10
1 concepto2 20
1 concepto3 15
1 concepto4 30
2 concepto2 15
2 concepto3 25


y necesito poder mostrar (en pantalla o a través de un reporte) esta tabla como sigue:

idcliente concepto1 concepto2 concepto3 concepto4
1 10 20 15 30
2 15 25

es decir, poder armarla en tiempo de ejecución.

Estoy utilizando interbase como motor de base de datos. Desde ya muchas gracias.
__________________
Atentamente
Luis

Última edición por lledesma fecha: 14-04-2004 a las 22:18:51. Razón: en la vista final no estan claras las tablas
Responder Con Cita
  #2  
Antiguo 15-04-2004
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 261
Poder: 21
Carmelo Cash Va por buen camino
Probá con esta, pero creo que en tu ejemplo faltan otros campos necesarios para identificar una transaccion (ej. Nro. de Factura)

Select
Tr.IdCliente as Cliente
, (Select Sum(TD.Importe) From TransactionDetails TD Where TD.IdCliente= TR.IdCliente And TD.Item_Code = 1 ) As Codigo1
, (Select Sum(TD.Importe) From TransactionDetails TD Where TD.IdCliente = TR.IdCliente And TD.Item_Code = 2 ) As Codigo2
, (Select Sum(TD.Importe) From TransactionDetails TD Where TD.IdCliente = TR.IdCliente And TD.Item_Code = 3 ) As Codigo3
, (Select Sum(TD.Importe) From TransactionDetails TD Where TD.IdCliente = TR.IdCliente And TD.Item_Code = 4 ) As Codigo4

From TransactionDetails TR


También podés reemplazar "And TD.Item_Code = 4 " por "And TD.Item_Code In (2,5)" y obtener en una columna la suma de varios conceptos.

Suerte
Responder Con Cita
  #3  
Antiguo 15-04-2004
lledesma lledesma is offline
Miembro
 
Registrado: abr 2004
Posts: 43
Poder: 0
lledesma Va por buen camino
Te agradezco mucho por contestar. De todos modos creo que no fui muy claro en el ejemplo, en realidad es una sola tabla que necesito armarla en forma de matriz. la estructura que utilicé es a modo de ejemplo. No tengo que realizar ninguna operación solo acomodar los datos de otro modo.

idcliente..Detalle....... Numero
1...........concepto1.....10
1...........concepto2.....15
1...........concepton.....##
2...........Concepto1.....40

idcliente........Concepto1.......Concepto2.........concepto n
1....................10.................15.....................##
2....................40

* Los puntos los utilizo para tabular (soy nuevo y no se como hacerlo).

la cantidad de registros no lo conozco, pueden ir de 1 a n para un mismo cliente, por eso es que necesito armar la consulta en tiempo de ejecución.

Se que soy complicado, pero en fin. Muchisimas Gracias.
__________________
Atentamente
Luis
Responder Con Cita
  #4  
Antiguo 15-04-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
En realidad el concepto de la consulta propuesta sirve para resolver este problema (se llaman consultas de referencias cruzadas).

Más o menos :

Código:
select distinct Recorrido.IdCliente
(select sum(Numero) from Tabla Concepto where Recorrido.IdCliente = Concepto.IdCliente and Concepto.Detalle = 'concepto1') as concepto1,
(select sum(Numero) from Tabla Concepto where Recorrido.IdCliente = Concepto.IdCliente and Concepto.Detalle = 'concepto2') as concepto2,
... 
(select sum(Numero) from Tabla Concepto where Recorrido.IdCliente = Concepto.IdCliente and Concepto.Detalle = 'concepton') as concepton
from Tabla Recorrido
Nota : He supuesto que un cliente puede tener más de una linea, para el mismo concepto. En cuyo caso los sumamos. Si estás seguro que eso nunca va a suceder, puedes quitar el sum.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 15-04-2004 a las 22:29:29.
Responder Con Cita
  #5  
Antiguo 15-04-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
NOTA : Recorrido y Concepto són alias de la Tabla en que están los datos (la he llamado Tabla).
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #6  
Antiguo 15-04-2004
lledesma lledesma is offline
Miembro
 
Registrado: abr 2004
Posts: 43
Poder: 0
lledesma Va por buen camino
muchas gracias. Lo pruebo y te aviso
__________________
Atentamente
Luis
Responder Con Cita
  #7  
Antiguo 16-04-2004
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 22
ramiretor Va por buen camino
Hola:
Yo como siempre metiendo la cuchara donde no me llaman. Para Oracle como BD no he podido hacer la consulta como la plantea Marc, en esta situación existe una función decode cuya sintaxis es algo así como:
decode(ELCAMPO, ValorEnCampo,Resultado)

en donde si ValorEnCampo es verdadero regresa Resultado. Siguiendo la lógica de la consulta tenemos:

select a.idcliente,
sum(decode(detalle,'Concepto1',Numero)) as concepto1,
sum(decode(detalle,'Concepto2',Numero)) as concepto2,
...
sum(decode(detalle, 'Concepton', numero) as concepton
from cliente a
group by a.idcliente

que es otra manera de hacerlo y me gustaría me dijeran si hay una función similar en otros motores de BD, por ejemplo IB.

Espero sirva de algo como complemento y saludos a todos
__________________
Ernesto R.
Responder Con Cita
  #8  
Antiguo 16-04-2004
lledesma lledesma is offline
Miembro
 
Registrado: abr 2004
Posts: 43
Poder: 0
lledesma Va por buen camino
Lo propuesto por Carmelo y Marc funciona de maravilla, Muchas Gracias. Una pequeña cansulta: Tengo algun limite en la cantidad de caracteres que puedo incluir en una consulta?, teniendo en cuenta que esta dependerá de la cantidad de registros que tenga por cada idcliente
__________________
Atentamente
Luis
Responder Con Cita
  #9  
Antiguo 16-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Supongo que será un límite impuesto por cada servidor SQL. En teoría, cualquier servidor "serio" debiera aceptarte consultas bastante grandes... se me ocurre que un límite teórico "normal" debiera ser 65535 caracteres... pero es mejor leer la documentación al respecto de tu motor.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
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 23:10:30.


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