FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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 |
#3
|
|||
|
|||
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 |
#4
|
||||
|
||||
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 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. |
#5
|
||||
|
||||
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). |
#6
|
|||
|
|||
muchas gracias. Lo pruebo y te aviso
__________________
Atentamente Luis |
#7
|
|||
|
|||
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. |
#8
|
|||
|
|||
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 |
#9
|
||||
|
||||
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 |
|
|
|