tres columnas

13/07/2003 - 19:23 por Anubis | Informe spam
Hola amigos,

Una ayudita please...
El tema es que tengo una tabla de este tipo:

codigo concepto valor tipo
0001 Basico 500 1
0001 Familiar 10 1
0001 Afp Pension 10 2
0001 Afp Seguro 10 2
0001 Afp Aporte 13 2
0001 Salud 13 3
0002 .
0002 .

Y quisiera obtener el siguiente resultado (agrupado por Codigo y con
columnas agrupadas por Tipo):

0001 Basico 500 Afp Pension 10 Salud 13
0001 Familiar 10 Afp Seguro 10
0001 Afp Aporte 13

Esto es para mostrar un Reporte y lo he intentado en Crystal Report 6.0 y
directamente desde SQL, cualquier solucion en uno de estos 2 me puede
ayudar.

Gracias.

Anubis.
 

Leer las respuestas

#1 josenadim
15/07/2003 - 01:35 | Informe spam
hola anubis esto es de los genois que mantiene este foro... debes utilizar cursores
aunque aqui hay dos opciones muy buenas planteadas por los gurus del foro

Jose Nadim


El problema es el siguiente. Partamos de los datos que se muestran a
continuacion:

Empleado Mensaje
0001 mensaje 1
0001 mensaje 2
0001 mensaje 3
0002 mensaje 1
0002 mensaje 2
0002 mensaje 3

lo que necesito es hacer una agrupacion por empleados y que me concatenelos
mensajes. por ejemplo

Empleado Mensaje
0001 mensaje 1, mensaje 2, mensaje 3
0002 mensaje 1, mensaje 2, mensaje 3


De antemano gracias
Saludos

Mensaje 2 de la secuencia
Autor:msnews ()
Asunto:RE: Como concatenar cadenas dentro de un select


View this article only
Grupos de noticias:microsoft.public.es.sqlserver
Fecha:2001-05-03 14:54:01 PST

Tienes que crear un Procedimiento almacenado. Por lo tanto tienes que
programar, usando cursores
por ej.

create table #temp
( codigo,
descripcion
)

declare MICURSOR curcor
select codigo, Descripcion from mensajes order codigo

open MICURSOR
FETCH MICURSOR INTO @code, @Msg

while @@fetch_status <> 0
Begin
select @xCode = @code

select @cString = ""
while @@fetch_status <> 0 and @xCode = @Code
Begin
select @cString = @cString + @Msg
FETCH MICURSOR INTO @code, @Msg
End
insert #temp values(@Code, @cString)
End
select * from #temp
unallocate MICURSOR -- elimina el cursor (no estoy seguro de la sintaxis)



otra forma



Aquí tienes un ejemplo de cómo resolverlo, que es más eficiente que creando
un cursor, ya que acumula actualizaciones a varias filas en cada pasada.

Por cierto, esto va para todos los miembros de este grupo, cuando envíeiss
preguntas como esta, envíad las instrucciones para generar todos los objetos
y los datos de ejemplo, con lo que nos ahorraiss un buen trabajo. Así
empleamos nuestro tiempo en resolver el problema, no en reproducir la
pregunta.


CREATE TABLE Claudio (
Item int,
Comp varchar(20),
Nro int,
[Descripción Producto] varchar(50),
Importe smallmoney
)

INSERT Claudio
VALUES (1, 'Factura', 10, 'Prod xx1', 10)

INSERT Claudio
VALUES (1, 'Factura', 10, 'Prod xx2', 10)

INSERT Claudio
VALUES (1, 'Factura', 10, 'Prod xx3', 10)

INSERT Claudio
VALUES (1, 'Factura', 10, 'Prod xx4', 10)

CREATE INDEX ndxClaudio ON Claudio (Comp ASC, Nro ASC, [Descripción
Producto] DESC)


GO

CREATE TABLE TotalesDeClaudio (
Comp varchar(20),
Nro int,
[Todos los productos del comprobante] varchar(8000),
Importe smallmoney
)


INSERT TotalesDeClaudio
SELECT Comp, Nro, ''
, sum(Importe) as Importe
From Claudio
GROUP BY Comp, Nro

WHILE 1=1
BEGIN
UPDATE TotalesdeClaudio
SET [Todos los productos del comprobante] CASE [Todos los productos del comprobante]
WHEN '' THEN [Descripción Producto]
ELSE [Todos los productos del comprobante] + ' - ' + [Descripción
Producto]
END
FROM TotalesdeClaudio TC
JOIN Claudio AS C (Index (ndxClaudio))
ON TC.Comp = C.Comp
AND TC.Nro = C.Nro
AND CHARINDEX([Descripción Producto], TC.[Todos los productos del
comprobante]) = 0

IF @@ROWCOUNT=0 BREAK
END

SELECT *
FROM TotalesDeClaudio


OTRA





Autor:Fernando G. Guerrero ()
Asunto:Re: Concatenar caracteries no se puede??
View: Complete Thread (11 artículos)
Original Format
Grupos de noticias:microsoft.public.es.sqlserver
Fecha:2001-11-24 07:56:27 PST


Aquí hay otra solución que utiliza una variable tabla, y que es más
eficiente que la otra solución anterior para grandes tablas, ya que no hace
más que un UPDATe por fila y pasada.

Es bastante fácil cambiar la variable tabla por una tabla temporal.

DECLARE @TotalesDeClaudio TABLE(
Comp varchar(20),
Nro int,
[Todos los productos del comprobante] varchar(8000),
Importe smallmoney
)


INSERT @TotalesDeClaudio
SELECT DISTINCT Comp, Nro, ''
, SUM(Importe)
From Claudio
GROUP BY Comp, Nro

WHILE 1=1
BEGIN
UPDATE @TotalesdeClaudio
SET [Todos los productos del comprobante] CASE [Todos los productos del comprobante]
WHEN '' THEN DP
ELSE [Todos los productos del comprobante] + ' - ' + DP
END
FROM (
SELECT TC.Comp, TC.Nro,
MIN([Descripción Producto]) AS DP
FROM @TotalesdeClaudio TC
JOIN Claudio AS C
ON TC.Comp = C.Comp
AND TC.Nro = C.Nro
AND CHARINDEX([Descripción Producto], TC.[Todos los productos del
comprobante]) = 0
GROUP BY TC.Comp, TC.Nro
) AS C
JOIN @TotalesDeClaudio TC
ON TC.Comp = C.Comp
AND TC.Nro = C.Nro

IF @@ROWCOUNT=0 BREAK
END

SELECT *
FROM @TotalesDeClaudio




Preguntas similares