Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta para reportes (https://www.clubdelphi.com/foros/showthread.php?t=9117)

lledesma 14-04-2004 21:53:05

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.

Carmelo Cash 15-04-2004 19:28:35

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

lledesma 15-04-2004 21:57:47

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.

guillotmarc 15-04-2004 22:25:44

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.

guillotmarc 15-04-2004 22:28:07

NOTA : Recorrido y Concepto són alias de la Tabla en que están los datos (la he llamado Tabla).

lledesma 15-04-2004 23:49:36

muchas gracias. Lo pruebo y te aviso

ramiretor 16-04-2004 01:06:11

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
;)

lledesma 16-04-2004 15:23:54

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

jachguate 16-04-2004 17:46:11

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.

;)


La franja horaria es GMT +2. Ahora son las 00:11:51.

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