URGENTE Query con Campos de Calculo en SQL....

08/11/2006 - 22:55 por Gijon | Informe spam
Hola estoy elaborando consulta, en la cual
tres campos apartir de los cuales deseo generar un cuarto -campo calculado-
el cual debera guardar un dato acumulado que se SUMA ó RESTA dependiendo de
el valor de otro campo. La tabla es como sigue

Campo1: Char -Valores C ó A - -TipoMov
Campo2: Numerico -Cargo-
Campo3: Numerico -Abono-
Campo4: CampoCalculado -Saldo-

El campo calculado que deseo es algo como lo siguiente:

X=0
if TipoMov="C" then
X=X+Campo1
else
X=X-Campo2

Campo4=X

Como veran necesito un calculo el cual debera guardar un valor anterior X
pero no se como hacer la sintaxis correcta.

Por Ejempor

TipoMov Cargo Abono Saldo
C 1000 0 1000
C 500 0 1500
A 0 1200 300
C 500 0 800
A 0 200 600
A 0 300 300



Gracias

Atte Lic. Gijon

Preguntas similare

Leer las respuestas

#1 BitOne®
09/11/2006 - 00:15 | Informe spam
Gijon:

Has:

select tipoMov,
cargo,
abono,
saldo,
case when tipomov = 'C' then x + campo1
else x - campo1
end CampoCalculado
from tabla

Go

Saludos,

BitOne®

"Gijon" wrote in message
news:
Hola estoy elaborando consulta, en la cual
tres campos apartir de los cuales deseo generar un cuarto -campo


calculado-
el cual debera guardar un dato acumulado que se SUMA ó RESTA dependiendo


de
el valor de otro campo. La tabla es como sigue

Campo1: Char -Valores C ó A - -TipoMov
Campo2: Numerico -Cargo-
Campo3: Numerico -Abono-
Campo4: CampoCalculado -Saldo-

El campo calculado que deseo es algo como lo siguiente:

X=0
if TipoMov="C" then
X=X+Campo1
else
X=X-Campo2

Campo4=X

Como veran necesito un calculo el cual debera guardar un valor anterior X
pero no se como hacer la sintaxis correcta.

Por Ejempor

TipoMov Cargo Abono Saldo
C 1000 0 1000
C 500 0 1500
A 0 1200 300
C 500 0 800
A 0 200 600
A 0 300 300



Gracias

Atte Lic. Gijon

Respuesta Responder a este mensaje
#2 Gijon
09/11/2006 - 01:09 | Informe spam
BitOne

He hecho lo que dijiste ahora mi problema es que no se acumula el dato.
esta es la consulta que hice apartir de lo que tu me dijiste...

declare @x int
set @x=0
select
FechaMovimiento,
TipoMov,
Salida as Cargo,
Entrada as Abono,
case TipoMov
when 'A' then @x - Salida
else @x + Entrada
end as Saldo
from VImpKardexSinAbonosA

El problema es que @x se limpia cada que entra al CASE y yo quiero que
conserve el valor anterio.
Si tenemos 4 filas esto seria asi:

TipoMov CArgo Abono

1.- C 1000 0 aqui @x valdria 1000
2.- A 0 500 aqui @x valdria 500
3.- A 0 200 aqui @x valdria 300
4.- C 100 0 aqui @x valdria 400


con la consulta que hice -la que te mostre arriba- lo que obtengo es lo
siguiente:


TipoMov CArgo Abono

1.- C 1000 0 aqui @x me da -1000
2.- A 0 500 aqui @x me da 500
3.- A 0 200 aqui @x me da 200
4.- C 100 0 aqui @x valdria -100

como veras no me guarda el valor acumulado.

Ojala me puedas ayudar ya que esta Query me esta volviendo loco.

Gracias.








"BitOne®" wrote:

Gijon:

Has:

select tipoMov,
cargo,
abono,
saldo,
case when tipomov = 'C' then x + campo1
else x - campo1
end CampoCalculado
from tabla

Go

Saludos,

BitOne®

"Gijon" wrote in message
news:
> Hola estoy elaborando consulta, en la cual
> tres campos apartir de los cuales deseo generar un cuarto -campo
calculado-
> el cual debera guardar un dato acumulado que se SUMA ó RESTA dependiendo
de
> el valor de otro campo. La tabla es como sigue
>
> Campo1: Char -Valores C ó A - -TipoMov
> Campo2: Numerico -Cargo-
> Campo3: Numerico -Abono-
> Campo4: CampoCalculado -Saldo-
>
> El campo calculado que deseo es algo como lo siguiente:
>
> X=0
> if TipoMov="C" then
> X=X+Campo1
> else
> X=X-Campo2
>
> Campo4=X
>
> Como veran necesito un calculo el cual debera guardar un valor anterior X
> pero no se como hacer la sintaxis correcta.
>
> Por Ejempor
>
> TipoMov Cargo Abono Saldo
> C 1000 0 1000
> C 500 0 1500
> A 0 1200 300
> C 500 0 800
> A 0 200 600
> A 0 300 300
>
>
>
> Gracias
>
> Atte Lic. Gijon
>



Respuesta Responder a este mensaje
#3 BitOne
09/11/2006 - 02:15 | Informe spam
Gijon:

Vamos a aclarar algo

Que es lo que quieres claramente acumular los valores en un solo campo?

Si muestra como quisieras que queden los valores seria mucho mas comodo.

Saludos,

BitOne


"Gijon" wrote in message
news:
BitOne

He hecho lo que dijiste ahora mi problema es que no se acumula el dato.
esta es la consulta que hice apartir de lo que tu me dijiste...

declare @x int
set @x=0
select
FechaMovimiento,
TipoMov,
Salida as Cargo,
Entrada as Abono,
case TipoMov
when 'A' then @x - Salida
else @x + Entrada
end as Saldo
from VImpKardexSinAbonosA

El problema es que @x se limpia cada que entra al CASE y yo quiero que
conserve el valor anterio.
Si tenemos 4 filas esto seria asi:

TipoMov CArgo Abono

1.- C 1000 0 aqui @x valdria 1000
2.- A 0 500 aqui @x valdria 500
3.- A 0 200 aqui @x valdria 300
4.- C 100 0 aqui @x valdria 400


con la consulta que hice -la que te mostre arriba- lo que obtengo es lo
siguiente:


TipoMov CArgo Abono

1.- C 1000 0 aqui @x me da -1000
2.- A 0 500 aqui @x me da 500
3.- A 0 200 aqui @x me da 200
4.- C 100 0 aqui @x valdria -100

como veras no me guarda el valor acumulado.

Ojala me puedas ayudar ya que esta Query me esta volviendo loco.

Gracias.








"BitOne®" wrote:

> Gijon:
>
> Has:
>
> select tipoMov,
> cargo,
> abono,
> saldo,
> case when tipomov = 'C' then x + campo1
> else x - campo1
> end CampoCalculado
> from tabla
>
> Go
>
> Saludos,
>
> BitOne®
>
> "Gijon" wrote in message
> news:
> > Hola estoy elaborando consulta, en la cual
> > tres campos apartir de los cuales deseo generar un cuarto -campo
> calculado-
> > el cual debera guardar un dato acumulado que se SUMA ó RESTA


dependiendo
> de
> > el valor de otro campo. La tabla es como sigue
> >
> > Campo1: Char -Valores C ó A - -TipoMov
> > Campo2: Numerico -Cargo-
> > Campo3: Numerico -Abono-
> > Campo4: CampoCalculado -Saldo-
> >
> > El campo calculado que deseo es algo como lo siguiente:
> >
> > X=0
> > if TipoMov="C" then
> > X=X+Campo1
> > else
> > X=X-Campo2
> >
> > Campo4=X
> >
> > Como veran necesito un calculo el cual debera guardar un valor


anterior X
> > pero no se como hacer la sintaxis correcta.
> >
> > Por Ejempor
> >
> > TipoMov Cargo Abono Saldo
> > C 1000 0 1000
> > C 500 0 1500
> > A 0 1200 300
> > C 500 0 800
> > A 0 200 600
> > A 0 300 300
> >
> >
> >
> > Gracias
> >
> > Atte Lic. Gijon
> >
>
>
>
Respuesta Responder a este mensaje
#4 Alejandro Mesa
09/11/2006 - 15:34 | Informe spam
Gijon,

Cuando se postea este tipo de problemas en el grupo, es de mucha ayuda que
se postee la estructura de la tabla, data de ejemplo y resultados esperados.
Un script que nos permita crear las tablas e insertar la data de ejemplo, asi
de esta forma no tenemos que ocupar parte de nuestro tiempo recreando el
ejemplo. No crees que la ayuda deba ser mutua?

Creo que falta informacion en el ejemplo que posteastes, pues no veo
informacion sobre la cuenta donde se hace el movimineto, la fecha en que se
efectuo ese movimineto y que juega un papel primordial para calcular el saldo
de la cuenta, etc.

use northwind
go

create table dbo.t1 (
mov_id int not null identity(1, 1) primary key clustered,
fecha_mov datetime not null,
Account int not null,
TipoMov char(1) not null check (TipoMov = 'A' or TipoMov = 'C'),
Cargo money not null check (Cargo >= 0),
Abono money not null check (Abono >= 0)
)
go

insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-01T08:30:00', 1, 'C', 1000, 0)
insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-02T08:30:00', 1, 'C', 500, 0)
insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-03T08:30:00', 1, 'A', 0, 1200)
insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-04T08:30:00', 1, 'C', 500, 0)
insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-05T08:30:00', 1, 'A', 0, 200)
insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-06T08:30:00', 1, 'A', 0, 300)
insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-05T08:30:00', 2, 'C', 100, 0)
insert into dbo.t1(fecha_mov, Account, TipoMov, Cargo, Abono)
values('2006-11-06T08:30:00', 2, 'A', 0, 50)
go

select
a.Account,
a.fecha_mov,
a.TipoMov,
a.Cargo + (-1 * a.Abono) as valor_mov,
sum((b.Cargo + (-1 * b.Abono))) as Saldo
from
dbo.t1 as a
inner join
dbo.t1 as b
on a.Account = b.Account
and a.fecha_mov >= b.fecha_mov
group by
a.Account,
a.fecha_mov,
a.TipoMov,
a.Cargo + (-1 * a.Abono)
order by
a.Account,
a.fecha_mov
go

drop table dbo.t1
go

De acuerdo a tu ambiente y necesidades, puedieras agregar la columna [Saldo]
a la tabla de cuentas y actualizar esta columna mediante el procedimiento que
ingresa los movimientos, o puedes crear una vista indexada, o puedes crear un
trigger, o puedes crear un procedimiento de actualizacion que se ejecute cada
cierto periodo.


AMB

"Gijon" wrote:

Hola estoy elaborando consulta, en la cual
tres campos apartir de los cuales deseo generar un cuarto -campo calculado-
el cual debera guardar un dato acumulado que se SUMA ó RESTA dependiendo de
el valor de otro campo. La tabla es como sigue

Campo1: Char -Valores C ó A - -TipoMov
Campo2: Numerico -Cargo-
Campo3: Numerico -Abono-
Campo4: CampoCalculado -Saldo-

El campo calculado que deseo es algo como lo siguiente:

X=0
if TipoMov="C" then
X=X+Campo1
else
X=X-Campo2

Campo4=X

Como veran necesito un calculo el cual debera guardar un valor anterior X
pero no se como hacer la sintaxis correcta.

Por Ejempor

TipoMov Cargo Abono Saldo
C 1000 0 1000
C 500 0 1500
A 0 1200 300
C 500 0 800
A 0 200 600
A 0 300 300



Gracias

Atte Lic. Gijon

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