Consulta sencilla en sql (creo)

08/06/2005 - 18:06 por SergioT | Informe spam
Hola

Tengo una tabla mas o menos asi TABLA(NroDoc, Item,CantIng,CantSal) que
tiene los intgresaso y salidas de almacen deseo obtener una consulta así:

select item,NroDoc,CantIng,CantSal
fom TABLA
Where Item='a'

Item NroDoc CantIng CantSal SALDO
a 123 10 0
10
a 125 100 0
110
a 54 0 60
50

Mi problema es que no se como calcular la columna SALDO en la consulta con
sql, por que no quiero tener que mediante programa recorrer el DS y llenar
esta columna ya que no me parece optimo y ademas estoy seguro que será mas
rapido el sqlServer que el codigo que sume y reste en el DS resultante


GRACIAS POR LA AYUDA
salu2
Sergio

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
08/06/2005 - 18:49 | Informe spam
Ve si esto te silve.

use northwind
go

create table t1 (
Item varchar(15) not null,
NroDoc int not null,
CantIng int not null,
CantSal int not null
)

insert into t1 values('a', 123, 10, 0)
insert into t1 values('a', 125, 100, 0)
insert into t1 values('a', 54, 0, 60)
go

select
item,
nrodoc,
canting,
cantsal,
case
when canting > 0 then (select sum(canting) from t1 as b where b.item =
a.item and b.nrodoc <= a.nrodoc)
else isnull((select sum(canting) from t1 as b where b.item = a.item), 0) -
(select sum(cantsal) from t1 as b where b.item = a.item and b.nrodoc <=
a.nrodoc)
end as saldo
from
t1 as a
order by
item,
case when canting > 0 then 0 else 1 end,
nrodoc
go

drop table t1
go

Me pregunto si esta tabla tendra una columna tipo datetime donde se guarda
la fecha y timepo de la transaccion?. Como ves, he tenido que forzar el orden
de procesamiento para poder obtener un resultado concistente cada vez que se
ejecute la sentencia con los mismos datos de prueba.


AMB



"SergioT" wrote:

Hola

Tengo una tabla mas o menos asi TABLA(NroDoc, Item,CantIng,CantSal) que
tiene los intgresaso y salidas de almacen deseo obtener una consulta así:

select item,NroDoc,CantIng,CantSal
fom TABLA
Where Item='a'

Item NroDoc CantIng CantSal SALDO
a 123 10 0
10
a 125 100 0
110
a 54 0 60
50

Mi problema es que no se como calcular la columna SALDO en la consulta con
sql, por que no quiero tener que mediante programa recorrer el DS y llenar
esta columna ya que no me parece optimo y ademas estoy seguro que será mas
rapido el sqlServer que el codigo que sume y reste en el DS resultante


GRACIAS POR LA AYUDA
salu2
Sergio



Respuesta Responder a este mensaje
#2 Jose Antonio
09/06/2005 - 12:07 | Informe spam
Yo he probado a realizar la consulta de las dos formas y es muchisimo mas
rápido actualizar la columna saldo en el cliente recorriendo el DataTable
correspondiente.

"SergioT" escribió en el mensaje
news:%
Hola

Tengo una tabla mas o menos asi TABLA(NroDoc, Item,CantIng,CantSal) que
tiene los intgresaso y salidas de almacen deseo obtener una consulta así:

select item,NroDoc,CantIng,CantSal
fom TABLA
Where Item='a'

Item NroDoc CantIng CantSal SALDO
a 123 10 0 10
a 125 100 0 110
a 54 0 60 50

Mi problema es que no se como calcular la columna SALDO en la consulta con
sql, por que no quiero tener que mediante programa recorrer el DS y llenar
esta columna ya que no me parece optimo y ademas estoy seguro que será mas
rapido el sqlServer que el codigo que sume y reste en el DS resultante


GRACIAS POR LA AYUDA
salu2
Sergio

Respuesta Responder a este mensaje
#3 SergioT
09/06/2005 - 14:51 | Informe spam
En serio????

yo creia que el sql lo resolvería mucho mas rapido, t voy a hacer caso, por
q no le pillo la forma correcta de la consulta

gracias por el concejo
Salu2
Sergio

"Jose Antonio" wrote in message
news:uXVX%
Yo he probado a realizar la consulta de las dos formas y es muchisimo mas
rápido actualizar la columna saldo en el cliente recorriendo el DataTable
correspondiente.

"SergioT" escribió en el mensaje
news:%
Hola

Tengo una tabla mas o menos asi TABLA(NroDoc, Item,CantIng,CantSal) que
tiene los intgresaso y salidas de almacen deseo obtener una consulta
así:

select item,NroDoc,CantIng,CantSal
fom TABLA
Where Item='a'

Item NroDoc CantIng CantSal SALDO
a 123 10 0 10
a 125 100 0 110
a 54 0 60 50

Mi problema es que no se como calcular la columna SALDO en la consulta
con sql, por que no quiero tener que mediante programa recorrer el DS y
llenar esta columna ya que no me parece optimo y ademas estoy seguro que
será mas rapido el sqlServer que el codigo que sume y reste en el DS
resultante


GRACIAS POR LA AYUDA
salu2
Sergio





Respuesta Responder a este mensaje
#4 SergioT
09/06/2005 - 15:41 | Informe spam
Hola

T cuento q no funciona bien por el orden, creo me faltó indicarte que en esa
tabla hay una fecha y un indicador de si es una transaccion de ingreso o
salida y neceito que el resultado esté ordenado por fecha y ese indicador,
en realidad la figura mas completa es :

TIPOS(Tipo,Nombre, Ingresol) = Tipos de transaccion de inventarios
TABLA(NroDoc, Item, Fecha,Tipo, CantIng,CantSal) = Detalle de Mov. de
inventario

En realidad un ejemplo de datos seria:

TIPOS TIpo Nombre Ingreso
1 Compras 1
2 Salidas 0
3 Ventas 0

TABLA
Item Tipo NroDoc Fecha
CantIng CantSal
a 1 565 01/01/2005
10 0
b 1 565 01/01/2005
05 0
c 1 565 01/01/2005
12 0
a 2 15 02/01/2005
0 5
b 2 20 02/01/2005
0 9
a 3 51 02/01/2005
0 2
b 2 05 03/01/2005
0 9
a 3 52 03/01/2005
0 1
a 3 53 03/01/2005
0 3
a 1 566 03/01/2005
10 0


Consulta del kardex para el item 'a' debe sacar:

Item Nombre NroDoc Fecha
CantIng CantSal Saldo
a Compras 565 01/01/2005
10 10
a Salidas 15 02/01/2005
5 5
a Ventas 51 02/01/2005
2 3
a Compras 566 03/01/2005
10 13
a Ventas 52 03/01/2005
1 12
a Ventas 53 03/01/2005
3 9

Aqui te envio un script de ejemplo con la creacion de los datos de prueba de
arriba, para que t sea mas facil ayudarme :)

use northwind
go

create table TIPOS (
TIPO smallint not null,
Nombre varchar(20) not null,
EsSalida bit not null
)
go
create table TABLA (
Item varchar(15) not null,
Tipo smallint not null,
NroDoc int not null,
Fecha datetime not null,
CantIng int not null,
CantSal int not null
)
insert into tipos values(1, 'Compras',0)
insert into tipos values(2, 'Salidas',1)
insert into tipos values(3, 'Ventas',1)
go

insert into tabla values('a',1,565,'01/01/2005',10,0)
insert into tabla values('b',1,565,'01/01/2005',5,0)
insert into tabla values('c',1,565,'01/01/2005',12,0)
insert into tabla values('a',2,15,'002/01/2005',0,5)
insert into tabla values('b',2,20,'02/01/2005',0,9)
insert into tabla values('a',3,51,'02/01/2005',0,2)
insert into tabla values('b',2,05,'03/01/2005',0,9)
insert into tabla values('a',3,52,'03/01/2005',0,1)
insert into tabla values('a',3,53,'03/01/2005',0,3)
insert into tabla values('a',1,566,'03/01/2005',10,0)
go

/*Muestro los datos de ejemplo*/
select * from tipos
select * from tabla

/*Aqui esta la consulta en la que necesito ayuda para aumentarle la columna
Saldo
=*/
select m.item, t.nombre,m.NroDoc,
fecha,canting,cantsal
From Tabla M inner join tipos T on M.tipo=T.tipo
where m.item='a'
Order by M.fecha,t.essalida
/*=*/
drop table tipos
drop table tabla
go



Salu2 y gracias

"Alejandro Mesa" wrote in message
news:
Ve si esto te silve.

use northwind
go

create table t1 (
Item varchar(15) not null,
NroDoc int not null,
CantIng int not null,
CantSal int not null
)

insert into t1 values('a', 123, 10, 0)
insert into t1 values('a', 125, 100, 0)
insert into t1 values('a', 54, 0, 60)
go

select
item,
nrodoc,
canting,
cantsal,
case
when canting > 0 then (select sum(canting) from t1 as b where b.item > a.item and b.nrodoc <= a.nrodoc)
else isnull((select sum(canting) from t1 as b where b.item = a.item), 0) -
(select sum(cantsal) from t1 as b where b.item = a.item and b.nrodoc <> a.nrodoc)
end as saldo
from
t1 as a
order by
item,
case when canting > 0 then 0 else 1 end,
nrodoc
go

drop table t1
go

Me pregunto si esta tabla tendra una columna tipo datetime donde se guarda
la fecha y timepo de la transaccion?. Como ves, he tenido que forzar el
orden
de procesamiento para poder obtener un resultado concistente cada vez que
se
ejecute la sentencia con los mismos datos de prueba.


AMB



"SergioT" wrote:

Hola

Tengo una tabla mas o menos asi TABLA(NroDoc, Item,CantIng,CantSal) que
tiene los intgresaso y salidas de almacen deseo obtener una consulta
así:

select item,NroDoc,CantIng,CantSal
fom TABLA
Where Item='a'

Item NroDoc CantIng CantSal SALDO
a 123 10 0
10
a 125 100 0
110
a 54 0 60
50

Mi problema es que no se como calcular la columna SALDO en la consulta
con
sql, por que no quiero tener que mediante programa recorrer el DS y
llenar
esta columna ya que no me parece optimo y ademas estoy seguro que será
mas
rapido el sqlServer que el codigo que sume y reste en el DS resultante


GRACIAS POR LA AYUDA
salu2
Sergio



Respuesta Responder a este mensaje
#5 Alejandro Mesa
09/06/2005 - 18:39 | Informe spam
Sergio,

Te agradezco que hayas posteado el script, de verdad que ayuda muchisimo.
Por otra parte, aunque la solucion que posteo supuestamente de los resultados
deseados, entenderla sera un reto y eso se debe tener en cuenta cuando
programamos, pues no somos los unicos que tendremos acceso a ese codigo. Yo
te aconsejo para este caso, usar un consecutivo, he ingresar las
transacciones en el mismo orden que estas ocurren.

use northwind
go

create table t1 (
tipo smallint not null,
nombre varchar(20) not null,
essalida bit not null
)
go
create table t2 (
item varchar(15) not null,
tipo smallint not null,
nrodoc int not null,
fecha datetime not null,
canting int not null,
cantsal int not null
)
insert into t1 values(1, 'Compras',0)
insert into t1 values(2, 'Salidas',1)
insert into t1 values(3, 'Ventas',1)
go

insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',1,565,'01/01/2005',10,0)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('b',1,565,'01/01/2005',5,0)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('c',1,565,'01/01/2005',12,0)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',2,15,'002/01/2005',0,5)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('b',2,20,'02/01/2005',0,9)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',3,51,'02/01/2005',0,2)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('b',2,05,'03/01/2005',0,9)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',3,52,'03/01/2005',0,1)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',3,53,'03/01/2005',0,3)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',1,566,'03/01/2005',10,0)
go

select
m.item,
t.nombre as tipo_mov,
t.essalida,
m.nrodoc,
m.fecha,
m.canting,
m.cantsal,
(
select
sum((case when tipo.essalida = 1 then -1 else 1 end) * (m1.canting +
m1.cantsal))
from
t2 as m1
inner join
t1 as tipo
on m1.tipo = tipo.tipo
where
m1.item = m.item
and ((t.essalida = 0 and (m1.fecha < m.fecha or (m1.fecha = m.fecha and
tipo.essalida = 0))) or
t.essalida = 1 and m1.fecha <= m.fecha and (tipo.essalida = 0 or m1.nrodoc
<= m.nrodoc))
) as saldo
from
t2 m
inner join
t1 t
on m.tipo = t.tipo
where
m.item='a'
order by
m.fecha, t.essalida, m.nrodoc
go

truncate table t2
go

alter table t2
add c1 int not null identity unique
go

insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',1,565,'01/01/2005',10,0)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',2,15,'002/01/2005',0,5)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',3,51,'02/01/2005',0,2)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',1,566,'03/01/2005',10,0)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',3,52,'03/01/2005',0,1)
insert into t2 (item, tipo, nrodoc, fecha, canting, cantsal)
values('a',3,53,'03/01/2005',0,3)
go

select
m.item,
t.nombre as tipo_mov,
t.essalida,
m.nrodoc,
m.fecha,
m.canting,
m.cantsal,
(
select
sum((case when tipo.essalida = 1 then -1 else 1 end) * (m1.canting +
m1.cantsal))
from
t2 as m1
inner join
t1 as tipo
on m1.tipo = tipo.tipo
where
m1.item = m.item
and m1.c1 <= m.c1
) as saldo
from
t2 m
inner join
t1 t
on m.tipo = t.tipo
where
m.item='a'
order by
m.c1
go

select
m.item,
t.nombre as tipo_mov,
t.essalida,
m.nrodoc,
m.fecha,
m.canting,
m.cantsal,
sum((case when tipo.essalida = 1 then -1 else 1 end) * (m1.canting +
m1.cantsal)) as saldo
from
(
t2 m
inner join
t1 t
on m.tipo = t.tipo
)
inner join
(
t2 as m1
inner join
t1 as tipo
on m1.tipo = tipo.tipo
)
on m.item = m1.item and m1.c1 <= m.c1
group by
m.c1,
m.item,
t.nombre,
t.essalida,
m.nrodoc,
m.fecha,
m.canting,
m.cantsal
order by
m.item, m.c1
go

drop table t1
drop table t2
go


AMB


"SergioT" wrote:

Hola

T cuento q no funciona bien por el orden, creo me faltó indicarte que en esa
tabla hay una fecha y un indicador de si es una transaccion de ingreso o
salida y neceito que el resultado esté ordenado por fecha y ese indicador,
en realidad la figura mas completa es :

TIPOS(Tipo,Nombre, Ingresol) = Tipos de transaccion de inventarios
TABLA(NroDoc, Item, Fecha,Tipo, CantIng,CantSal) = Detalle de Mov. de
inventario

En realidad un ejemplo de datos seria:

TIPOS TIpo Nombre Ingreso
1 Compras 1
2 Salidas 0
3 Ventas 0

TABLA
Item Tipo NroDoc Fecha
CantIng CantSal
a 1 565 01/01/2005
10 0
b 1 565 01/01/2005
05 0
c 1 565 01/01/2005
12 0
a 2 15 02/01/2005
0 5
b 2 20 02/01/2005
0 9
a 3 51 02/01/2005
0 2
b 2 05 03/01/2005
0 9
a 3 52 03/01/2005
0 1
a 3 53 03/01/2005
0 3
a 1 566 03/01/2005
10 0


Consulta del kardex para el item 'a' debe sacar:

Item Nombre NroDoc Fecha
CantIng CantSal Saldo
a Compras 565 01/01/2005
10 10
a Salidas 15 02/01/2005
5 5
a Ventas 51 02/01/2005
2 3
a Compras 566 03/01/2005
10 13
a Ventas 52 03/01/2005
1 12
a Ventas 53 03/01/2005
3 9

Aqui te envio un script de ejemplo con la creacion de los datos de prueba de
arriba, para que t sea mas facil ayudarme :)

use northwind
go

create table TIPOS (
TIPO smallint not null,
Nombre varchar(20) not null,
EsSalida bit not null
)
go
create table TABLA (
Item varchar(15) not null,
Tipo smallint not null,
NroDoc int not null,
Fecha datetime not null,
CantIng int not null,
CantSal int not null
)
insert into tipos values(1, 'Compras',0)
insert into tipos values(2, 'Salidas',1)
insert into tipos values(3, 'Ventas',1)
go

insert into tabla values('a',1,565,'01/01/2005',10,0)
insert into tabla values('b',1,565,'01/01/2005',5,0)
insert into tabla values('c',1,565,'01/01/2005',12,0)
insert into tabla values('a',2,15,'002/01/2005',0,5)
insert into tabla values('b',2,20,'02/01/2005',0,9)
insert into tabla values('a',3,51,'02/01/2005',0,2)
insert into tabla values('b',2,05,'03/01/2005',0,9)
insert into tabla values('a',3,52,'03/01/2005',0,1)
insert into tabla values('a',3,53,'03/01/2005',0,3)
insert into tabla values('a',1,566,'03/01/2005',10,0)
go

/*Muestro los datos de ejemplo*/
select * from tipos
select * from tabla

/*Aqui esta la consulta en la que necesito ayuda para aumentarle la columna
Saldo
=*/
select m.item, t.nombre,m.NroDoc,
fecha,canting,cantsal
From Tabla M inner join tipos T on M.tipo=T.tipo
where m.item='a'
Order by M.fecha,t.essalida
/*=*/
drop table tipos
drop table tabla
go



Salu2 y gracias

"Alejandro Mesa" wrote in message
news:
> Ve si esto te silve.
>
> use northwind
> go
>
> create table t1 (
> Item varchar(15) not null,
> NroDoc int not null,
> CantIng int not null,
> CantSal int not null
> )
>
> insert into t1 values('a', 123, 10, 0)
> insert into t1 values('a', 125, 100, 0)
> insert into t1 values('a', 54, 0, 60)
> go
>
> select
> item,
> nrodoc,
> canting,
> cantsal,
> case
> when canting > 0 then (select sum(canting) from t1 as b where b.item > > a.item and b.nrodoc <= a.nrodoc)
> else isnull((select sum(canting) from t1 as b where b.item = a.item), 0) -
> (select sum(cantsal) from t1 as b where b.item = a.item and b.nrodoc <> > a.nrodoc)
> end as saldo
> from
> t1 as a
> order by
> item,
> case when canting > 0 then 0 else 1 end,
> nrodoc
> go
>
> drop table t1
> go
>
> Me pregunto si esta tabla tendra una columna tipo datetime donde se guarda
> la fecha y timepo de la transaccion?. Como ves, he tenido que forzar el
> orden
> de procesamiento para poder obtener un resultado concistente cada vez que
> se
> ejecute la sentencia con los mismos datos de prueba.
>
>
> AMB
>
>
>
> "SergioT" wrote:
>
>> Hola
>>
>> Tengo una tabla mas o menos asi TABLA(NroDoc, Item,CantIng,CantSal) que
>> tiene los intgresaso y salidas de almacen deseo obtener una consulta
>> así:
>>
>> select item,NroDoc,CantIng,CantSal
>> fom TABLA
>> Where Item='a'
>>
>> Item NroDoc CantIng CantSal SALDO
>> a 123 10 0
>> 10
>> a 125 100 0
>> 110
>> a 54 0 60
>> 50
>>
>> Mi problema es que no se como calcular la columna SALDO en la consulta
>> con
>> sql, por que no quiero tener que mediante programa recorrer el DS y
>> llenar
>> esta columna ya que no me parece optimo y ademas estoy seguro que será
>> mas
>> rapido el sqlServer que el codigo que sume y reste en el DS resultante
>>
>>
>> GRACIAS POR LA AYUDA
>> salu2
>> Sergio
>>
>>
>>



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