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

#1 jcac
12/03/2008 - 16:02 | Informe spam
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
#2 Eva
12/03/2008 - 16:31 | Informe spam
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
#3 jcac
12/03/2008 - 16:42 | Informe spam
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
#4 jcac
12/03/2008 - 17:09 | Informe spam
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
#5 Eva
12/03/2008 - 20:20 | Informe spam
Gracias por todo Juan Carlos :) Temo que esta segunda sería bastante
terrible con la sentencia completa, pero ya me las arreglaré :)

Un saludo

Eva

"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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida