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

#6 jose
04/01/2007 - 10:42 | Informe spam
Hola Yoli

A lo mejor es que no me entero bien o no me explico bien. Cualquiera de las
dos cosas.

Lo que necesito es ir sumando el saldo de la cuenta con todos los
movimientos. Si ejecuto la Select de Alejandro, no consigo llevar el saldo
de toda la cuenta, sino que me muestra la cantiddad con el correspondiente
signo. Es decir

Fecha Tipo Cantidad Saldo
2-1-07 1 100 100
2-1-07 1 50 50
3-1-07 2 75 -75

Cuando lo que necesito es que se obtenga lo siguiente:
Fecha Tipo Cantidad Saldo
2-1-07 1 100 100
2-1-07 1 50 150
3-1-07 2 75 75


Y mi problema es que no se como obteber el saldo por cada movimiento

Muchas gracias

Jose Mª Cousiño

"Yoli" escribió en el mensaje
news:
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
#7 jose
04/01/2007 - 17:25 | Informe spam
Hola Alejandro

Tienes toda la razon, no habia visto el SUM, y la habia probado sin ello, y
claro no me aparecia sumado.

Muchas gracias por tu gran explicación.

Un saludo

Jose
"Alejandro Mesa" escribió en el
mensaje news:
Jose,

Creo que no has entendido la sentencia. La expresion "case" esta dentro de
una funcion de grupo, en este caso "sum", por lo que por cada fila se suma
las cantidades previas, incluyendo la cantidad de la fila corriente,
mediante
el uso de un query correlacionado.

Cuando se postea este tipo de preguntas en el grupo, es recomendable que
se
postee la estructura de las tablas involucradas, incluyendo restricciones
e
indices, asi como data de ejemplo (sentencias insert) y resultados
esperados.
De esta forma, quien trate de ayudar no tendra que gastar tiempo (muy
valioso) en simular la realidad de quien postea y evitar mayores
confusiones.
La ayuda debe ser mutua, no crees?

Ejemplo:

create table #t (
id_movimiento int not null identity primary key,
id_cuenta int not null,
fecha datetime not null,
tipo int not null check (tipo in (1, 2)),
concepto varchar(25),
cantidad money not null
)

insert into #t(id_cuenta, fecha, tipo, concepto, cantidad)
values(1, '20070102', 1, 'concepto 1', 100)

insert into #t(id_cuenta, fecha, tipo, concepto, cantidad)
values(1, '20070102', 1, 'concepto 2', 50)

insert into #t(id_cuenta, fecha, tipo, concepto, cantidad)
values(1, '20070102', 2, 'concepto 3', 75)

insert into #t(id_cuenta, fecha, tipo, concepto, cantidad)
values(2, '20070102', 1, 'concepto 1', 150)

insert into #t(id_cuenta, fecha, tipo, concepto, cantidad)
values(2, '20070102', 2, 'concepto 2', 55)

select
id_movimiento,
id_cuenta,
fecha,
tipo,
concepto,
cantidad,
(
select sum(case when tipo = 1 then cantidad else (-1 * cantidad) end)
from #t as m2
where
m2.id_cuenta = m1.id_cuenta
and
(
m2.fecha < m1.fecha
or (m2.fecha = m1.fecha and m2.id_movimiento <= m1.id_movimiento)
)
)as saldo
from
#t as m1
order by
id_cuenta,
fecha,
id_movimiento

drop table #t
go


AMB

"jose" wrote:

Hola Yoli

A lo mejor es que no me entero bien o no me explico bien. Cualquiera de
las
dos cosas.

Lo que necesito es ir sumando el saldo de la cuenta con todos los
movimientos. Si ejecuto la Select de Alejandro, no consigo llevar el
saldo
de toda la cuenta, sino que me muestra la cantiddad con el
correspondiente
signo. Es decir

Fecha Tipo Cantidad Saldo
2-1-07 1 100 100
2-1-07 1 50 50
3-1-07 2 75 -75

Cuando lo que necesito es que se obtenga lo siguiente:
Fecha Tipo Cantidad Saldo
2-1-07 1 100 100
2-1-07 1 50 150
3-1-07 2 75 75


Y mi problema es que no se como obteber el saldo por cada movimiento

Muchas gracias

Jose Mª Cousiño

"Yoli" escribió en el mensaje
news:
> 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
>>>> >
>>>> >
>>>> >
>>
>>
>
>



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