Campos Acumulados

06/03/2007 - 20:55 por CSotoX | Informe spam
Hola!!!

Tengo la siguiente duda, tengo una tabla con mas o menos la siguiente
estructura:

Codigo, Fecha, Tipo, Cant
01 01/02/07 I 5
01 01/02/07 E 10
01 02/02/07 S 3
01 03/02/07 E 15
01 03/02/07 I 10

Necesito crear una consulta con la siguiente escructura:

Codigo, Fecha, Tipo, Cant, Acumulado
01 01/02/07 I 5 5
01 01/02/07 E 10 15
01 02/02/07 S 3 12
01 03/02/07 E 15 27
01 03/02/07 I 10 17

Como veran E es igual a entrada y S es igual a salida, el problema esta
cuando es I, si el valor es I, debo colocar el valor exacto que aparece en
dicho registro

Yo puedo solucionarlo con un SUM(), pero el problema es como reinicio el
SUM() cuando se encuentre con un registro del tipo I.

Agradezco cualquier ayuda que puedan brindarme.

Muchas Gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
06/03/2007 - 21:17 | Informe spam
CSotoX,

Como podemos identificar el orden cronologico de las filas, osea, como
sabemos cual va primero y cual despues?

Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
pasa con la ultima fila, de donde salio el # 17?

01 03/02/07 I 10 17




AMB


"CSotoX" wrote:

Hola!!!

Tengo la siguiente duda, tengo una tabla con mas o menos la siguiente
estructura:

Codigo, Fecha, Tipo, Cant
01 01/02/07 I 5
01 01/02/07 E 10
01 02/02/07 S 3
01 03/02/07 E 15
01 03/02/07 I 10

Necesito crear una consulta con la siguiente escructura:

Codigo, Fecha, Tipo, Cant, Acumulado
01 01/02/07 I 5 5
01 01/02/07 E 10 15
01 02/02/07 S 3 12
01 03/02/07 E 15 27
01 03/02/07 I 10 17

Como veran E es igual a entrada y S es igual a salida, el problema esta
cuando es I, si el valor es I, debo colocar el valor exacto que aparece en
dicho registro

Yo puedo solucionarlo con un SUM(), pero el problema es como reinicio el
SUM() cuando se encuentre con un registro del tipo I.

Agradezco cualquier ayuda que puedan brindarme.

Muchas Gracias
Respuesta Responder a este mensaje
#2 CSotoX
06/03/2007 - 21:46 | Informe spam
Hola Alejandro!!!

Gracias por responder...

Te explico:

Como podemos identificar el orden cronologico de las filas, osea, como
sabemos cual va primero y cual despues?



R.: Por la Fecha, el cursor vendria ordenado por Fecha y orden de ingreso a
la Tabla.

Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
pasa con la ultima fila, de donde salio el # 17?

> 01 03/02/07 I 10 17



R.: Este fue un error de posteo, el valor real seria:

01 03/02/07 I 10 10


Gracias nuevamente


"Alejandro Mesa" wrote:

CSotoX,


Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
pasa con la ultima fila, de donde salio el # 17?

> 01 03/02/07 I 10 17


AMB


"CSotoX" wrote:

> Hola!!!
>
> Tengo la siguiente duda, tengo una tabla con mas o menos la siguiente
> estructura:
>
> Codigo, Fecha, Tipo, Cant
> 01 01/02/07 I 5
> 01 01/02/07 E 10
> 01 02/02/07 S 3
> 01 03/02/07 E 15
> 01 03/02/07 I 10
>
> Necesito crear una consulta con la siguiente escructura:
>
> Codigo, Fecha, Tipo, Cant, Acumulado
> 01 01/02/07 I 5 5
> 01 01/02/07 E 10 15
> 01 02/02/07 S 3 12
> 01 03/02/07 E 15 27
> 01 03/02/07 I 10 17
>
> Como veran E es igual a entrada y S es igual a salida, el problema esta
> cuando es I, si el valor es I, debo colocar el valor exacto que aparece en
> dicho registro
>
> Yo puedo solucionarlo con un SUM(), pero el problema es como reinicio el
> SUM() cuando se encuentre con un registro del tipo I.
>
> Agradezco cualquier ayuda que puedan brindarme.
>
> Muchas Gracias
Respuesta Responder a este mensaje
#3 Alejandro Mesa
06/03/2007 - 22:29 | Informe spam
CSotoX,

No estoy convencido de esta solucion, me parece que falta algo. Si dos
transacciones 'E' y 'S' ocurren en la misma fecha, el resultado no sera
correcto. Tambien quiciera saber si la suma debe ser a partir de la ultima
transaccion tipo 'I' previa a las 'E' / 'I' que se analizan, osea, si el
contador vuelve a inicializarse a partir the la 'I'?

Que resultado esperas si insertamos la sgte fila?



create table dbo.t1 (
Codigo char(2) not null,
Fecha datetime not null,
Tipo char(1) not null,
Cant int not null
)
go

insert into dbo.t1 values('01', '20070201', 'I', 5)
insert into dbo.t1 values('01', '20070201', 'E', 10)
insert into dbo.t1 values('01', '20070202', 'S', 3)
insert into dbo.t1 values('01', '20070203', 'E', 5)
insert into dbo.t1 values('01', '20070203', 'I', 10)
go

select
Codigo,
Fecha,
Tipo,
Cant,
(
case
when Tipo = 'I' then Cant
else
(
select sum(case when Tipo in ('E', 'I') then b.Cant else -1 * b.Cant end)
from dbo.t1 as b
where b.Codigo = a.Codigo and b.Fecha <= a.Fecha
)
end
) as Acumulado
from
dbo.t1 as a
order by
Codigo,
Fecha
go

drop table dbo.t1
go


AMB


"CSotoX" wrote:

Hola Alejandro!!!

Gracias por responder...

Te explico:

> Como podemos identificar el orden cronologico de las filas, osea, como
> sabemos cual va primero y cual despues?

R.: Por la Fecha, el cursor vendria ordenado por Fecha y orden de ingreso a
la Tabla.

> Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
> pasa con la ultima fila, de donde salio el # 17?
>
> > 01 03/02/07 I 10 17

R.: Este fue un error de posteo, el valor real seria:

01 03/02/07 I 10 10


Gracias nuevamente


"Alejandro Mesa" wrote:

> CSotoX,
>
>
> Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
> pasa con la ultima fila, de donde salio el # 17?
>
> > 01 03/02/07 I 10 17
>
>
> AMB
>
>
> "CSotoX" wrote:
>
> > Hola!!!
> >
> > Tengo la siguiente duda, tengo una tabla con mas o menos la siguiente
> > estructura:
> >
> > Codigo, Fecha, Tipo, Cant
> > 01 01/02/07 I 5
> > 01 01/02/07 E 10
> > 01 02/02/07 S 3
> > 01 03/02/07 E 15
> > 01 03/02/07 I 10
> >
> > Necesito crear una consulta con la siguiente escructura:
> >
> > Codigo, Fecha, Tipo, Cant, Acumulado
> > 01 01/02/07 I 5 5
> > 01 01/02/07 E 10 15
> > 01 02/02/07 S 3 12
> > 01 03/02/07 E 15 27
> > 01 03/02/07 I 10 17
> >
> > Como veran E es igual a entrada y S es igual a salida, el problema esta
> > cuando es I, si el valor es I, debo colocar el valor exacto que aparece en
> > dicho registro
> >
> > Yo puedo solucionarlo con un SUM(), pero el problema es como reinicio el
> > SUM() cuando se encuentre con un registro del tipo I.
> >
> > Agradezco cualquier ayuda que puedan brindarme.
> >
> > Muchas Gracias
Respuesta Responder a este mensaje
#4 CSotoX
07/03/2007 - 16:59 | Informe spam
Hola Alejandro!!!


R: El resultado de la consulta deberia ser la siguiente:


Codigo, Fecha, Tipo, Cant, Acumulado
01 01/02/07 I 5 5
01 01/02/07 E 10 15
01 02/02/07 S 3 12
01 03/02/07 E 15 27
01 03/02/07 I 10 17
01 04/02/07 I 15 15

No estoy convencido de esta solucion, me parece que falta algo. Si dos
transacciones 'E' y 'S' ocurren en la misma fecha, el resultado no sera
correcto.




R: Si son transacciones 'E' y 'S' ocurren el mismo dia, el sistema debe
calcularla en el orden de ingreso, ej: Si agreso la siguientes 2 lineas:

insert into dbo.t1 values('01', '20070205', 'E', 5)
insert into dbo.t1 values('01', '20070205', 'S', 8)

El Resultado seria el Siguiente:

Codigo, Fecha, Tipo, Cant, Acumulado
01 01/02/07 I 5 5
01 01/02/07 E 10 15
01 02/02/07 S 3 12
01 03/02/07 E 15 27
01 03/02/07 I 10 17
01 04/02/07 I 15 15
01 05/02/07 E 5 20
01 05/02/07 S 8 12


Tambien quiciera saber si la suma debe ser a partir de la ultima
transaccion tipo 'I' previa a las 'E' / 'I' que se analizan, osea, si el
contador vuelve a inicializarse a partir the la 'I'?



R: La sume debe realizarse desde la primera transaccion del Inicio del Rango
de Fecha, no necesariamente la primera transaccion debe ser un de tipo 'I',
puede ser una de tipo 'E', para eso el acumulador debe iniciarse en cero (0)

Gracias nuevamente por tu ayuda, voy a probar el codigo que enviastes a ver
si me resuelve el problema (o parte de el).




"Alejandro Mesa" wrote:

CSotoX,

No estoy convencido de esta solucion, me parece que falta algo. Si dos
transacciones 'E' y 'S' ocurren en la misma fecha, el resultado no sera
correcto. Tambien quiciera saber si la suma debe ser a partir de la ultima
transaccion tipo 'I' previa a las 'E' / 'I' que se analizan, osea, si el
contador vuelve a inicializarse a partir the la 'I'?

Que resultado esperas si insertamos la sgte fila?



create table dbo.t1 (
Codigo char(2) not null,
Fecha datetime not null,
Tipo char(1) not null,
Cant int not null
)
go

insert into dbo.t1 values('01', '20070201', 'I', 5)
insert into dbo.t1 values('01', '20070201', 'E', 10)
insert into dbo.t1 values('01', '20070202', 'S', 3)
insert into dbo.t1 values('01', '20070203', 'E', 5)
insert into dbo.t1 values('01', '20070203', 'I', 10)
go

select
Codigo,
Fecha,
Tipo,
Cant,
(
case
when Tipo = 'I' then Cant
else
(
select sum(case when Tipo in ('E', 'I') then b.Cant else -1 * b.Cant end)
from dbo.t1 as b
where b.Codigo = a.Codigo and b.Fecha <= a.Fecha
)
end
) as Acumulado
from
dbo.t1 as a
order by
Codigo,
Fecha
go

drop table dbo.t1
go


AMB


"CSotoX" wrote:

> Hola Alejandro!!!
>
> Gracias por responder...
>
> Te explico:
>
> > Como podemos identificar el orden cronologico de las filas, osea, como
> > sabemos cual va primero y cual despues?
>
> R.: Por la Fecha, el cursor vendria ordenado por Fecha y orden de ingreso a
> la Tabla.
>
> > Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
> > pasa con la ultima fila, de donde salio el # 17?
> >
> > > 01 03/02/07 I 10 17
>
> R.: Este fue un error de posteo, el valor real seria:
>
> 01 03/02/07 I 10 10
>
>
> Gracias nuevamente
>
>
> "Alejandro Mesa" wrote:
>
> > CSotoX,
> >
> >
> > Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
> > pasa con la ultima fila, de donde salio el # 17?
> >
> > > 01 03/02/07 I 10 17
> >
> >
> > AMB
> >
> >
> > "CSotoX" wrote:
> >
> > > Hola!!!
> > >
> > > Tengo la siguiente duda, tengo una tabla con mas o menos la siguiente
> > > estructura:
> > >
> > > Codigo, Fecha, Tipo, Cant
> > > 01 01/02/07 I 5
> > > 01 01/02/07 E 10
> > > 01 02/02/07 S 3
> > > 01 03/02/07 E 15
> > > 01 03/02/07 I 10
> > >
> > > Necesito crear una consulta con la siguiente escructura:
> > >
> > > Codigo, Fecha, Tipo, Cant, Acumulado
> > > 01 01/02/07 I 5 5
> > > 01 01/02/07 E 10 15
> > > 01 02/02/07 S 3 12
> > > 01 03/02/07 E 15 27
> > > 01 03/02/07 I 10 17
> > >
> > > Como veran E es igual a entrada y S es igual a salida, el problema esta
> > > cuando es I, si el valor es I, debo colocar el valor exacto que aparece en
> > > dicho registro
> > >
> > > Yo puedo solucionarlo con un SUM(), pero el problema es como reinicio el
> > > SUM() cuando se encuentre con un registro del tipo I.
> > >
> > > Agradezco cualquier ayuda que puedan brindarme.
> > >
> > > Muchas Gracias
Respuesta Responder a este mensaje
#5 CSotoX
07/03/2007 - 18:03 | Informe spam
Hola Alejandro!!!

Ya probe tu codigo y se aproxima bastante a mi necesidad, pero como
comentas, hay problemas cuando varias transacciones del tipo 'E', 'I' y 'S',
estan en el mismo dia.

Le agregue un campo Identidad a la tabla llamado eIDX y modifique tu
consulta por:

Modificación realizada: where b.Codigo = a.Codigo and b.eIDX <= a.eIDX

select
Codigo,
Fecha,
Tipo,
Cant,
(
case
when Tipo = 'I' then Cant
else
(
select sum(case when Tipo in ('E', 'I') then b.Cant else -1 * b.Cant end)
from dbo.t1 as b
where b.Codigo = a.Codigo and b.eIDX <= a.eIDX
)
end
) as Acumulado
from
dbo.t1 as a
order by
Codigo,
Fecha


Pero igual si en un mismo dia hay muchas transacciones, me regresa valores
incorrectos.

Si me puedes comentar alguna alguna solucion que se te ocurra, te lo
agradeceria de sobre manera.

Mil gracias por tus respuestas



"CSotoX" wrote:

Hola Alejandro!!!


R: El resultado de la consulta deberia ser la siguiente:


Codigo, Fecha, Tipo, Cant, Acumulado
01 01/02/07 I 5 5
01 01/02/07 E 10 15
01 02/02/07 S 3 12
01 03/02/07 E 15 27
01 03/02/07 I 10 17
01 04/02/07 I 15 15

> No estoy convencido de esta solucion, me parece que falta algo. Si dos
> transacciones 'E' y 'S' ocurren en la misma fecha, el resultado no sera
> correcto.


R: Si son transacciones 'E' y 'S' ocurren el mismo dia, el sistema debe
calcularla en el orden de ingreso, ej: Si agreso la siguientes 2 lineas:

insert into dbo.t1 values('01', '20070205', 'E', 5)
insert into dbo.t1 values('01', '20070205', 'S', 8)

El Resultado seria el Siguiente:

Codigo, Fecha, Tipo, Cant, Acumulado
01 01/02/07 I 5 5
01 01/02/07 E 10 15
01 02/02/07 S 3 12
01 03/02/07 E 15 27
01 03/02/07 I 10 17
01 04/02/07 I 15 15
01 05/02/07 E 5 20
01 05/02/07 S 8 12


>Tambien quiciera saber si la suma debe ser a partir de la ultima
> transaccion tipo 'I' previa a las 'E' / 'I' que se analizan, osea, si el
> contador vuelve a inicializarse a partir the la 'I'?

R: La sume debe realizarse desde la primera transaccion del Inicio del Rango
de Fecha, no necesariamente la primera transaccion debe ser un de tipo 'I',
puede ser una de tipo 'E', para eso el acumulador debe iniciarse en cero (0)

Gracias nuevamente por tu ayuda, voy a probar el codigo que enviastes a ver
si me resuelve el problema (o parte de el).




"Alejandro Mesa" wrote:

> CSotoX,
>
> No estoy convencido de esta solucion, me parece que falta algo. Si dos
> transacciones 'E' y 'S' ocurren en la misma fecha, el resultado no sera
> correcto. Tambien quiciera saber si la suma debe ser a partir de la ultima
> transaccion tipo 'I' previa a las 'E' / 'I' que se analizan, osea, si el
> contador vuelve a inicializarse a partir the la 'I'?
>
> Que resultado esperas si insertamos la sgte fila?
>
>
>
> create table dbo.t1 (
> Codigo char(2) not null,
> Fecha datetime not null,
> Tipo char(1) not null,
> Cant int not null
> )
> go
>
> insert into dbo.t1 values('01', '20070201', 'I', 5)
> insert into dbo.t1 values('01', '20070201', 'E', 10)
> insert into dbo.t1 values('01', '20070202', 'S', 3)
> insert into dbo.t1 values('01', '20070203', 'E', 5)
> insert into dbo.t1 values('01', '20070203', 'I', 10)
> go
>
> select
> Codigo,
> Fecha,
> Tipo,
> Cant,
> (
> case
> when Tipo = 'I' then Cant
> else
> (
> select sum(case when Tipo in ('E', 'I') then b.Cant else -1 * b.Cant end)
> from dbo.t1 as b
> where b.Codigo = a.Codigo and b.Fecha <= a.Fecha
> )
> end
> ) as Acumulado
> from
> dbo.t1 as a
> order by
> Codigo,
> Fecha
> go
>
> drop table dbo.t1
> go
>
>
> AMB
>
>
> "CSotoX" wrote:
>
> > Hola Alejandro!!!
> >
> > Gracias por responder...
> >
> > Te explico:
> >
> > > Como podemos identificar el orden cronologico de las filas, osea, como
> > > sabemos cual va primero y cual despues?
> >
> > R.: Por la Fecha, el cursor vendria ordenado por Fecha y orden de ingreso a
> > la Tabla.
> >
> > > Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
> > > pasa con la ultima fila, de donde salio el # 17?
> > >
> > > > 01 03/02/07 I 10 17
> >
> > R.: Este fue un error de posteo, el valor real seria:
> >
> > 01 03/02/07 I 10 10
> >
> >
> > Gracias nuevamente
> >
> >
> > "Alejandro Mesa" wrote:
> >
> > > CSotoX,
> > >
> > >
> > > Otra pregunta, segun dices cuando es "I" debes poner el valor exacto. Que
> > > pasa con la ultima fila, de donde salio el # 17?
> > >
> > > > 01 03/02/07 I 10 17
> > >
> > >
> > > AMB
> > >
> > >
> > > "CSotoX" wrote:
> > >
> > > > Hola!!!
> > > >
> > > > Tengo la siguiente duda, tengo una tabla con mas o menos la siguiente
> > > > estructura:
> > > >
> > > > Codigo, Fecha, Tipo, Cant
> > > > 01 01/02/07 I 5
> > > > 01 01/02/07 E 10
> > > > 01 02/02/07 S 3
> > > > 01 03/02/07 E 15
> > > > 01 03/02/07 I 10
> > > >
> > > > Necesito crear una consulta con la siguiente escructura:
> > > >
> > > > Codigo, Fecha, Tipo, Cant, Acumulado
> > > > 01 01/02/07 I 5 5
> > > > 01 01/02/07 E 10 15
> > > > 01 02/02/07 S 3 12
> > > > 01 03/02/07 E 15 27
> > > > 01 03/02/07 I 10 17
> > > >
> > > > Como veran E es igual a entrada y S es igual a salida, el problema esta
> > > > cuando es I, si el valor es I, debo colocar el valor exacto que aparece en
> > > > dicho registro
> > > >
> > > > Yo puedo solucionarlo con un SUM(), pero el problema es como reinicio el
> > > > SUM() cuando se encuentre con un registro del tipo I.
> > > >
> > > > Agradezco cualquier ayuda que puedan brindarme.
> > > >
> > > > Muchas Gracias
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida