Pivot con case, filas duplicadas

12/03/2008 - 15:13 por Eva | Informe spam
Hola a Todos

Tengo un problema (seguro que tonto) pero no llego a verlo.

Parto de la siguiente tabla:

(adjunto Picture0001)

Hago una select tal que:

select a.codigoempresa, a.ccoste,
importeact = case A.idperiodo
when 1 then A.importe
else 0
end,
importeant = case A.idperiodo
when 3 then A.importe
else 0
end
from MiTAbla as A

Y obtengo esto:

(adjunto Picture0002)

No entiendo por qué me está generando dos registros por cada
(codigoempresa-ccoste).

Cualquier ayuda es binvenida :)

Gracias, un saludo

Eva.

Preguntas similare

Leer las respuestas

#6 Eva
12/03/2008 - 20:50 | Informe spam
Juan Carlos, mil perdones. Me acabo de dar cuenta de que estoy metiendo la
pata hasta el fondo, efectivamente tengo que sumar, pero lo estoy haciendo
en un nivel inferior, totalmente equivocada.

Tu primera respuesta es la correcta, la adecuada y la que da el resultado
que yo quiero.

Mil gracias y perdona por haberte hecho perder el tiempo :(

"jcac" escribió en el mensaje
news:%
Eva,

Aqui tienes otra forma, pero viendo su plan de ejecucion es mas costosa
que la anterior.

select distinct a.codigoempresa, a.ccoste,
(select importe from #tmp where idperiodo = 1 and codigoempresa =
a.codigoempresa and ccoste = a.ccoste) as importeact,
(select importe from #tmp where idperiodo = 3 and codigoempresa =
a.codigoempresa and ccoste = a.ccoste) as importeant
from #tmp a
go
select a.codigoempresa, a.ccoste,
sum(case A.idperiodo when 1 then A.importe else 0 end) as importeact,
sum(case A.idperiodo when 3 then A.importe else 0 end) as importeant
from #tmp as A
group by a.codigoempresa, a.ccoste
go

Saludos

Juan Carlos
"jcac" escribió en el mensaje
news:
Hola Eva,

El tema es que los registros en tu base de datos son 2 por cada codigo de
empresa, por ello es que te muestra 2 filas como resultado. Quizas las
otras consultas que haces es de otra forma o los datos estan almacenados
de otra manera.

Saludos

Juan Carlos

"Eva" escribió en el mensaje
news:%23$
Hola jcac

Gracias por contestar :)

Ya había pensado en esa solución, tengo dos pegas: 1, la sentencia es
bastante más complicada :) 2. algunos campos no son sumables.

Pero, lo que no entiendo es por qué ocurre esto, en otras consultas
parecidas no me ocurre, me aparecen los datos en una única fila

Gracias, un saludo

Eva

"jcac" escribió en el mensaje
news:
Hola Eva,

Espero esto te ayude:

create table #tmp (idPeriodo int, CodigoEmpresa char(3), CCOSTE
char(5), Importe decimal(20,4), Cantidad decimal(20,4))
go
insert into #tmp values (1, '001', 'C2011', 338524.75, 55341.6)
insert into #tmp values (3, '001', 'C2011', 227411.62, 42956.43)
insert into #tmp values (1, '001', 'C2012', 172360.11, 23674.24)
insert into #tmp values (3, '001', 'C2012', 139583.84, 21141.47)
insert into #tmp values (1, '001', 'M0011', 419019.89, 6114.75)
insert into #tmp values (3, '001', 'M0011', 391668.63, 5902)
insert into #tmp values (1, '001', 'M0012', 144324.01, 2583.5)
insert into #tmp values (3, '001', 'M0012', 181187.40, 3333.5)
insert into #tmp values (1, '001', 'M0013', 339883.06, 5381)
insert into #tmp values (3, '001', 'M0013', 216983.91, 3422.5)
go
select a.codigoempresa, a.ccoste,
sum(case A.idperiodo when 1 then A.importe else 0 end) as importeact,
sum(case A.idperiodo when 3 then A.importe else 0 end) as importeant
from #tmp as A
group by a.codigoempresa, a.ccoste
go
select * from #tmp
go
drop table #tmp
go

Saludos

Juan Carlos Alemán

"Eva" escribió en el mensaje
news:
Perdón, se me escapó sin los archivos.

"Eva" escribió en el mensaje
news:
Hola a Todos

Tengo un problema (seguro que tonto) pero no llego a verlo.

Parto de la siguiente tabla:

(adjunto Picture0001)

Hago una select tal que:

select a.codigoempresa, a.ccoste,
importeact = case A.idperiodo
when 1 then A.importe
else 0
end,
importeant = case A.idperiodo
when 3 then A.importe
else 0
end
from MiTAbla as A

Y obtengo esto:

(adjunto Picture0002)

No entiendo por qué me está generando dos registros por cada
(codigoempresa-ccoste).

Cualquier ayuda es binvenida :)

Gracias, un saludo

Eva.


























Respuesta Responder a este mensaje
#7 jcac
12/03/2008 - 21:41 | Informe spam
No te preocupes estamos para ayudarnos :D

Saludos

Juan Carlos

"Eva" escribió en el mensaje
news:
Juan Carlos, mil perdones. Me acabo de dar cuenta de que estoy metiendo la
pata hasta el fondo, efectivamente tengo que sumar, pero lo estoy haciendo
en un nivel inferior, totalmente equivocada.

Tu primera respuesta es la correcta, la adecuada y la que da el resultado
que yo quiero.

Mil gracias y perdona por haberte hecho perder el tiempo :(

"jcac" escribió en el mensaje
news:%
Eva,

Aqui tienes otra forma, pero viendo su plan de ejecucion es mas costosa
que la anterior.

select distinct a.codigoempresa, a.ccoste,
(select importe from #tmp where idperiodo = 1 and codigoempresa =
a.codigoempresa and ccoste = a.ccoste) as importeact,
(select importe from #tmp where idperiodo = 3 and codigoempresa =
a.codigoempresa and ccoste = a.ccoste) as importeant
from #tmp a
go
select a.codigoempresa, a.ccoste,
sum(case A.idperiodo when 1 then A.importe else 0 end) as importeact,
sum(case A.idperiodo when 3 then A.importe else 0 end) as importeant
from #tmp as A
group by a.codigoempresa, a.ccoste
go

Saludos

Juan Carlos
"jcac" escribió en el mensaje
news:
Hola Eva,

El tema es que los registros en tu base de datos son 2 por cada codigo
de empresa, por ello es que te muestra 2 filas como resultado. Quizas
las otras consultas que haces es de otra forma o los datos estan
almacenados de otra manera.

Saludos

Juan Carlos

"Eva" escribió en el mensaje
news:%23$
Hola jcac

Gracias por contestar :)

Ya había pensado en esa solución, tengo dos pegas: 1, la sentencia es
bastante más complicada :) 2. algunos campos no son sumables.

Pero, lo que no entiendo es por qué ocurre esto, en otras consultas
parecidas no me ocurre, me aparecen los datos en una única fila

Gracias, un saludo

Eva

"jcac" escribió en el mensaje
news:
Hola Eva,

Espero esto te ayude:

create table #tmp (idPeriodo int, CodigoEmpresa char(3), CCOSTE
char(5), Importe decimal(20,4), Cantidad decimal(20,4))
go
insert into #tmp values (1, '001', 'C2011', 338524.75, 55341.6)
insert into #tmp values (3, '001', 'C2011', 227411.62, 42956.43)
insert into #tmp values (1, '001', 'C2012', 172360.11, 23674.24)
insert into #tmp values (3, '001', 'C2012', 139583.84, 21141.47)
insert into #tmp values (1, '001', 'M0011', 419019.89, 6114.75)
insert into #tmp values (3, '001', 'M0011', 391668.63, 5902)
insert into #tmp values (1, '001', 'M0012', 144324.01, 2583.5)
insert into #tmp values (3, '001', 'M0012', 181187.40, 3333.5)
insert into #tmp values (1, '001', 'M0013', 339883.06, 5381)
insert into #tmp values (3, '001', 'M0013', 216983.91, 3422.5)
go
select a.codigoempresa, a.ccoste,
sum(case A.idperiodo when 1 then A.importe else 0 end) as importeact,
sum(case A.idperiodo when 3 then A.importe else 0 end) as importeant
from #tmp as A
group by a.codigoempresa, a.ccoste
go
select * from #tmp
go
drop table #tmp
go

Saludos

Juan Carlos Alemán

"Eva" escribió en el mensaje
news:
Perdón, se me escapó sin los archivos.

"Eva" escribió en el mensaje
news:
Hola a Todos

Tengo un problema (seguro que tonto) pero no llego a verlo.

Parto de la siguiente tabla:

(adjunto Picture0001)

Hago una select tal que:

select a.codigoempresa, a.ccoste,
importeact = case A.idperiodo
when 1 then A.importe
else 0
end,
importeant = case A.idperiodo
when 3 then A.importe
else 0
end
from MiTAbla as A

Y obtengo esto:

(adjunto Picture0002)

No entiendo por qué me está generando dos registros por cada
(codigoempresa-ccoste).

Cualquier ayuda es binvenida :)

Gracias, un saludo

Eva.































email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida