Problemas con una select

03/01/2007 - 23:45 por jose | Informe spam
Hola a todos

Soy un poco novato con esto de las Select, y tengo una duda. La duda es la
siguiente.

Tengo una tabla, en la cual almaceno los datos sobre los movimientos de una
cuenta bancaria con los siguientes campos.

Id_Movimiento
Id_Cuenta
Fecha
Tipo -- campo que indetifica si es un ingreso o un pago
Cantidad
concepto

Quisiera saber como puedo sacar una select con todos los campos y ademas el
saldo por cada movimineto?

La select tendría que mostrar los siguientes campos
Select Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
saldo -- este es el que tengo dudas de como se obtendría el
saldo en cada movimiento
from Movimientos .

Muchas gracias

Jose Mª Cousiño

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
04/01/2007 - 01:50 | Informe spam
Jose,

El ejemplo que posteo Isaias (Gracias) puede ayudarte con la logica de como
resolver esa sentencia, pero como eres novato te voy a expandir la idea. Lo
primero es que nos digas que criterio usar para dar un orden cronologico a
los movimientos. Supongamos que los valores de columna [fecha] son usados con
este proposito, entonces podemos usar:

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad) end)
from dbo.moviminetos as m2
where m2.cuenta = m1.cuenta and m2.fecha <= m1.fecha
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go

Que pasaria si una cuenta tiene dos movimientos en la misma [fecha]?. Bueno,
la sentencia anterior no dara los resultados esperados puesto que se sumarian
ambas cantidades para un mismo movimiento. En estos casos necesitamos otro
criterio para romper ese amarre, por ejemplo escoger la columna
[Id_Movimiento].

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad) end)
from dbo.movimientos as m2
where
m2.cuenta = m1.cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.Id_Movimiento <= m1.Id_Movimiento)
)
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go


AMB

"jose" wrote:

Hola a todos

Soy un poco novato con esto de las Select, y tengo una duda. La duda es la
siguiente.

Tengo una tabla, en la cual almaceno los datos sobre los movimientos de una
cuenta bancaria con los siguientes campos.

Id_Movimiento
Id_Cuenta
Fecha
Tipo -- campo que indetifica si es un ingreso o un pago
Cantidad
concepto

Quisiera saber como puedo sacar una select con todos los campos y ademas el
saldo por cada movimineto?

La select tendría que mostrar los siguientes campos
Select Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
saldo -- este es el que tengo dudas de como se obtendría el
saldo en cada movimiento
from Movimientos .

Muchas gracias

Jose Mª Cousiño



Respuesta Responder a este mensaje
#2 Alejandro Mesa
04/01/2007 - 02:48 | Informe spam
Jose,

Mi señora me estava llamando para cenar (todos a la mesa) y se me paso
agregar la columna [Id_Movimiento] en la clausula "order by" de la segunda
sentencia "select".

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad) end)
from dbo.movimientos as m2
where
m2.cuenta = m1.cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.Id_Movimiento <= m1.Id_Movimiento)
)
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha,
Id_Movimiento
go

Es conveniente tener un indice por las columnas que se usan para particionar
el conjunto, en este caso [Id_Cuenta], las columnas por las que se ordena la
particion [fecha] y las columnas que se usan para romper los empates
[Id_Movimiento].

En caso de que estes usando sql server 2005, puedes emplear la nueva
clausula OVER, aplicada a funciones de agregacion.

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
sum(
case when tipo = 'I' then cantidad else (-1 * cantidad) end
)
over(partition by Id_Cuenta order by fecha, Id_Movimiento) as saldo
from
dbo.movimientos
order by
Id_Cuenta,
Fecha,
Id_Movimiento
go

Esto y mucho mas puedes leerlo en el libro "Inside Microsoft SQL Server
2005: T-SQL Querying" y tambien en los libros en linea.

http://www.amazon.com/o/ASIN/073562...89-8967668


AMB

"Alejandro Mesa" wrote:

Jose,

El ejemplo que posteo Isaias (Gracias) puede ayudarte con la logica de como
resolver esa sentencia, pero como eres novato te voy a expandir la idea. Lo
primero es que nos digas que criterio usar para dar un orden cronologico a
los movimientos. Supongamos que los valores de columna [fecha] son usados con
este proposito, entonces podemos usar:

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad) end)
from dbo.moviminetos as m2
where m2.cuenta = m1.cuenta and m2.fecha <= m1.fecha
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go

Que pasaria si una cuenta tiene dos movimientos en la misma [fecha]?. Bueno,
la sentencia anterior no dara los resultados esperados puesto que se sumarian
ambas cantidades para un mismo movimiento. En estos casos necesitamos otro
criterio para romper ese amarre, por ejemplo escoger la columna
[Id_Movimiento].

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad) end)
from dbo.movimientos as m2
where
m2.cuenta = m1.cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.Id_Movimiento <= m1.Id_Movimiento)
)
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go


AMB

"jose" wrote:

> Hola a todos
>
> Soy un poco novato con esto de las Select, y tengo una duda. La duda es la
> siguiente.
>
> Tengo una tabla, en la cual almaceno los datos sobre los movimientos de una
> cuenta bancaria con los siguientes campos.
>
> Id_Movimiento
> Id_Cuenta
> Fecha
> Tipo -- campo que indetifica si es un ingreso o un pago
> Cantidad
> concepto
>
> Quisiera saber como puedo sacar una select con todos los campos y ademas el
> saldo por cada movimineto?
>
> La select tendría que mostrar los siguientes campos
> Select Id_Movimiento,
> Id_Cuenta,
> Fecha,
> Tipo,
> concepto,
> cantidad,
> saldo -- este es el que tengo dudas de como se obtendría el
> saldo en cada movimiento
> from Movimientos .
>
> Muchas gracias
>
> Jose Mª Cousiño
>
>
>
Respuesta Responder a este mensaje
#3 jose
04/01/2007 - 08:10 | Informe spam
Hola Alejandro

Gracias por tu contestación. Pero tengo unas dudas.

Primero: en el case when tipo = T, aqui va el valor del tipo que eligas, me
supongo que seria 1 que en mi caso es ingreso. ¿Es así?

Dos: Pero con esta select en el campo Saldo no obtengo el saldo de la
cuenta, sino que obtengo la cantidad con el signo correspondiente al tipo de
movimiento haga (Ingreso (+) o Pago(-)).

El problema que tengo es que no se como llevar la suma de las cantidades en
la select. Tengo que declarame una variable? o como lo hago? esa es mi gran
duda.

Muchas gracias

Jose Mª Cousiño
"Alejandro Mesa" escribió en el
mensaje news:
Jose,

Mi señora me estava llamando para cenar (todos a la mesa) y se me paso
agregar la columna [Id_Movimiento] en la clausula "order by" de la segunda
sentencia "select".

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad) end)
from dbo.movimientos as m2
where
m2.cuenta = m1.cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.Id_Movimiento <= m1.Id_Movimiento)
)
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha,
Id_Movimiento
go

Es conveniente tener un indice por las columnas que se usan para
particionar
el conjunto, en este caso [Id_Cuenta], las columnas por las que se ordena
la
particion [fecha] y las columnas que se usan para romper los empates
[Id_Movimiento].

En caso de que estes usando sql server 2005, puedes emplear la nueva
clausula OVER, aplicada a funciones de agregacion.

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
sum(
case when tipo = 'I' then cantidad else (-1 * cantidad) end
)
over(partition by Id_Cuenta order by fecha, Id_Movimiento) as saldo
from
dbo.movimientos
order by
Id_Cuenta,
Fecha,
Id_Movimiento
go

Esto y mucho mas puedes leerlo en el libro "Inside Microsoft SQL Server
2005: T-SQL Querying" y tambien en los libros en linea.

http://www.amazon.com/o/ASIN/073562...89-8967668


AMB

"Alejandro Mesa" wrote:

Jose,

El ejemplo que posteo Isaias (Gracias) puede ayudarte con la logica de
como
resolver esa sentencia, pero como eres novato te voy a expandir la idea.
Lo
primero es que nos digas que criterio usar para dar un orden cronologico
a
los movimientos. Supongamos que los valores de columna [fecha] son usados
con
este proposito, entonces podemos usar:

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad)
end)
from dbo.moviminetos as m2
where m2.cuenta = m1.cuenta and m2.fecha <= m1.fecha
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go

Que pasaria si una cuenta tiene dos movimientos en la misma [fecha]?.
Bueno,
la sentencia anterior no dara los resultados esperados puesto que se
sumarian
ambas cantidades para un mismo movimiento. En estos casos necesitamos
otro
criterio para romper ese amarre, por ejemplo escoger la columna
[Id_Movimiento].

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad)
end)
from dbo.movimientos as m2
where
m2.cuenta = m1.cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.Id_Movimiento <= m1.Id_Movimiento)
)
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go


AMB

"jose" wrote:

> Hola a todos
>
> Soy un poco novato con esto de las Select, y tengo una duda. La duda es
> la
> siguiente.
>
> Tengo una tabla, en la cual almaceno los datos sobre los movimientos de
> una
> cuenta bancaria con los siguientes campos.
>
> Id_Movimiento
> Id_Cuenta
> Fecha
> Tipo -- campo que indetifica si es un ingreso o un pago
> Cantidad
> concepto
>
> Quisiera saber como puedo sacar una select con todos los campos y
> ademas el
> saldo por cada movimineto?
>
> La select tendría que mostrar los siguientes campos
> Select Id_Movimiento,
> Id_Cuenta,
> Fecha,
> Tipo,
> concepto,
> cantidad,
> saldo -- este es el que tengo dudas de como se obtendría el
> saldo en cada movimiento
> from Movimientos .
>
> Muchas gracias
>
> Jose Mª Cousiño
>
>
>
Respuesta Responder a este mensaje
#4 jose
04/01/2007 - 08:16 | Informe spam
Hola Isaias.

Gracias por tu respuesta.

Pero el problema que tengo, es que solamente puedo utilizar la tabla como te
la he mostrado. No me dejan cambiarla. Y es ahi donde tengo la duda de como
ir almacenado en la select el valor del saldo. Por que puedo distinguir los
que es un ingreso de un pago, lo que no se es como ir almacenado el saldo en
cada operacion.

Muchas gracias

Jose




"Isaias" escribió en el mensaje
news:
Esto fue publicado aqui mismo, espero te sirva de guia:

quisiera hacer una consulta que me devuelva estos 2 campos mas el saldo
que
van teniendo...
sumando las entrada y restando la salida...
Por Ejemplo:

id Entrada Salida Saldo
1 10 0 10
2 0 5 5
3 1 0 6
4 1 1 6



select
a.id,
a.entrada,
a.salida,
(
select sum(b.entrada - b.salida)
from dbo.t1 as b
where b.id <= a.id
) as saldo
from dbo.t1 as a
order by a.id
go

Saludos
IIslas


"jose" wrote:

Hola a todos

Soy un poco novato con esto de las Select, y tengo una duda. La duda es
la
siguiente.

Tengo una tabla, en la cual almaceno los datos sobre los movimientos de
una
cuenta bancaria con los siguientes campos.

Id_Movimiento
Id_Cuenta
Fecha
Tipo -- campo que indetifica si es un ingreso o un pago
Cantidad
concepto

Quisiera saber como puedo sacar una select con todos los campos y ademas
el
saldo por cada movimineto?

La select tendría que mostrar los siguientes campos
Select Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
saldo -- este es el que tengo dudas de como se obtendría el
saldo en cada movimiento
from Movimientos .

Muchas gracias

Jose Mª Cousiño



Respuesta Responder a este mensaje
#5 Yoli
04/01/2007 - 09:46 | Informe spam
Hola Jose,

Según el código de Alejando, en el CASE lo que hace es que si es de un tipo
concreto lo va a sumar con el signo cambiado:

CASE WHEN Tipo='I' --> Cuando el tipo sea Ingresos
THEN Cantidad --> Ingresos signo positivo, se suma la cantidad sin cambiarla
de signo.
ELSE (-1*Cantidad) --> Gastos signo negativo, se suma la cantidad con el
signo cambiado.
END

No sé si ahora lo habrás entendido.

En cuanto a declararte variables, yo creo que no es necesario, el campo es
calculado y te sale ahí ya.

Saludos.

Yoli
Hoy puede ser el día menos pensado...

"jose" escribió en el mensaje
news:%23H74T%
Hola Alejandro

Gracias por tu contestación. Pero tengo unas dudas.

Primero: en el case when tipo = T, aqui va el valor del tipo que eligas,
me supongo que seria 1 que en mi caso es ingreso. ¿Es así?

Dos: Pero con esta select en el campo Saldo no obtengo el saldo de la
cuenta, sino que obtengo la cantidad con el signo correspondiente al tipo
de movimiento haga (Ingreso (+) o Pago(-)).

El problema que tengo es que no se como llevar la suma de las cantidades
en la select. Tengo que declarame una variable? o como lo hago? esa es mi
gran duda.

Muchas gracias

Jose Mª Cousiño
"Alejandro Mesa" escribió en el
mensaje news:
Jose,

Mi señora me estava llamando para cenar (todos a la mesa) y se me paso
agregar la columna [Id_Movimiento] en la clausula "order by" de la
segunda
sentencia "select".

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad) end)
from dbo.movimientos as m2
where
m2.cuenta = m1.cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.Id_Movimiento <= m1.Id_Movimiento)
)
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha,
Id_Movimiento
go

Es conveniente tener un indice por las columnas que se usan para
particionar
el conjunto, en este caso [Id_Cuenta], las columnas por las que se ordena
la
particion [fecha] y las columnas que se usan para romper los empates
[Id_Movimiento].

En caso de que estes usando sql server 2005, puedes emplear la nueva
clausula OVER, aplicada a funciones de agregacion.

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
sum(
case when tipo = 'I' then cantidad else (-1 * cantidad) end
)
over(partition by Id_Cuenta order by fecha, Id_Movimiento) as saldo
from
dbo.movimientos
order by
Id_Cuenta,
Fecha,
Id_Movimiento
go

Esto y mucho mas puedes leerlo en el libro "Inside Microsoft SQL Server
2005: T-SQL Querying" y tambien en los libros en linea.

http://www.amazon.com/o/ASIN/073562...89-8967668


AMB

"Alejandro Mesa" wrote:

Jose,

El ejemplo que posteo Isaias (Gracias) puede ayudarte con la logica de
como
resolver esa sentencia, pero como eres novato te voy a expandir la idea.
Lo
primero es que nos digas que criterio usar para dar un orden cronologico
a
los movimientos. Supongamos que los valores de columna [fecha] son
usados con
este proposito, entonces podemos usar:

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad)
end)
from dbo.moviminetos as m2
where m2.cuenta = m1.cuenta and m2.fecha <= m1.fecha
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go

Que pasaria si una cuenta tiene dos movimientos en la misma [fecha]?.
Bueno,
la sentencia anterior no dara los resultados esperados puesto que se
sumarian
ambas cantidades para un mismo movimiento. En estos casos necesitamos
otro
criterio para romper ese amarre, por ejemplo escoger la columna
[Id_Movimiento].

select
Id_Movimiento,
Id_Cuenta,
Fecha,
Tipo,
concepto,
cantidad,
(
select sum(case when tipo = 'I' then cantidad else (-1 * cantidad)
end)
from dbo.movimientos as m2
where
m2.cuenta = m1.cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.Id_Movimiento <= m1.Id_Movimiento)
)
)as saldo
from
dbo.movimientos as m1
order by
Id_Cuenta,
Fecha
go


AMB

"jose" wrote:

> Hola a todos
>
> Soy un poco novato con esto de las Select, y tengo una duda. La duda
> es la
> siguiente.
>
> Tengo una tabla, en la cual almaceno los datos sobre los movimientos
> de una
> cuenta bancaria con los siguientes campos.
>
> Id_Movimiento
> Id_Cuenta
> Fecha
> Tipo -- campo que indetifica si es un ingreso o un pago
> Cantidad
> concepto
>
> Quisiera saber como puedo sacar una select con todos los campos y
> ademas el
> saldo por cada movimineto?
>
> La select tendría que mostrar los siguientes campos
> Select Id_Movimiento,
> Id_Cuenta,
> Fecha,
> Tipo,
> concepto,
> cantidad,
> saldo -- este es el que tengo dudas de como se obtendría
> el
> saldo en cada movimiento
> from Movimientos .
>
> Muchas gracias
>
> Jose Mª Cousiño
>
>
>






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida