Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Saldos dinamicos

Estas en el tema de Saldos dinamicos en el foro de SQL Server en Foros del Web. Hola a todos :), estoy aqui porque no le he podido dar solucion al siguiente problema que tengo, me explico un poco. La idea final ...
  #1 (permalink)  
Antiguo 20/12/2010, 11:54
 
Fecha de Ingreso: abril-2010
Mensajes: 38
Antigüedad: 14 años
Puntos: 0
Saldos dinamicos

Hola a todos :), estoy aqui porque no le he podido dar solucion al siguiente problema que tengo, me explico un poco.

La idea final es calcular un saldo de productos a una determinada fecha según todas las entradas (tipo_mov =1) versus todas las salidas (tipo_mov =2) que han tenido desde el inicio de los registros (01-11-2010) hasta el dia que quiera consultar, y asi determinar un saldo. Toda la información se encuentra registrada en 1 sola tabla (registros) esta tabla contiene solamente 4 columnas que son las siguientes:

FECHA_REGISTRO, TIPO_MOV, CODIGO, CANTIDAD


En la columna TIPO_MOV solo existen 2 posibilidades entradas ó salidas que son 1 y 2 respectivamente. Ahora mostrare mi ejemplo de una consulta que contiene solo entradas (resultado contiene 2 columna CODIGO, ENTRADAS)


CODIGO ENTRADAS
7229 655.000
7550 61.000

Y PARA LAS SALIDAS

CODIGO SALIDAS
7229 337.000
7230 59.000
7550 62.000

Para ambas ocupe el siguiente codigo
DECLARE @intinicial int, @intfinal int, @fecha_exist_inicial datetime,@fecha_exist_final datetime

set @fecha_exist_inicial = '01-11-2010' set @fecha_exist_final = '20-11-2010'
set @intinicial = '1' set @intfinal = '170319'

SELECT CODIGO, SUM(CANTIDAD) AS ENTRADAS
FROM REGISTROS
WHERE (CODIGO BETWEEN @intinicial AND @intfinal) AND
(FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND @fecha_exist_final) AND (TIPO_MOV =2)
GROUP BY CODIGO

solo cambie de 1 a 2 nada más en el TIPO_MOV

ahora es donde tengo el problema, el cual yo quiero tener ambas en 1 sola linea
que quedaria mas o menos asi las columnas FECHA_SALDO, CODIGO, ENTRADAS, SALIDAS, SALDO

y esto es el resultado de mi consulta que tengo

FECHA_SALDO CODIGO ENTRADAS SALIDAS SALDO
20-11-2010 7229 655.000 337.000 318.000
20-11-2010 7550 61.000 62.000 -1.000
y este es el codigo que ocupo

set dateformat dmy
go
DECLARE @intinicial int, @intfinal int, @fecha_exist_inicial datetime,@fecha_exist_final datetime

set @fecha_exist_inicial = '01-11-2010' set @fecha_exist_final = '20-11-2010'
set @intinicial = '1' set @intfinal = '170319'



SELECT @fecha_exist_final AS FECHA_SALDO, REGISTROS.CODIGO, SUM(REGISTROS.CANTIDAD) AS ENTRADAS, SALIDAS.SALIDAS AS SALIDAS,
SUM(REGISTROS.CANTIDAD) - SALIDAS.SALIDAS AS SALDO
FROM REGISTROS INNER JOIN
(SELECT CODIGO, SUM(CANTIDAD) AS SALIDAS
FROM REGISTROS AS REGISTROS_1
WHERE (CODIGO BETWEEN @intinicial AND @intfinal) AND (FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND @fecha_exist_final) AND
(TIPO_MOV = 2)
GROUP BY CODIGO) AS SALIDAS ON SALIDAS.CODIGO = REGISTROS.CODIGO
WHERE (REGISTROS.CODIGO BETWEEN @intinicial AND @intfinal) AND (REGISTROS.FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND
@fecha_exist_final) AND (REGISTROS.TIPO_MOV = 1)
GROUP BY REGISTROS.CODIGO, SALIDAS.SALIDAS

Pero como se bien, esta consulta me muestra la coincidencias de ambos codigos (lo cual con lo que quiero esta mala, porque no importa si esta en 1 el TIPO_MOV ó 2, la la idea es que me lo muestre =), en los tipos de movimientos (TIPO_MOV), Pero lo que quiero es que me muestre el codigo 7230 que tiene 59 de salidas, entoces su saldo seria -59

y el resultado de la consulta que QUIERO seria de la siguiente forma incluyendo el codigo 7230

FECHA_SALDO CODIGO ENTRADAS SALIDAS SALDO
20-11-2010 7229 655.000 337.000 318.000
20-11-2010 7550 61.000 62.000 -1.000
20-11-2010 7230 0 59 -59.000


obs. tambien lo he intentado con FULL OUTER JOIN y nada

Bueno espero haberme explicado bien, saludos y gracias de antemano.
  #2 (permalink)  
Antiguo 20/12/2010, 12:14
 
Fecha de Ingreso: abril-2010
Mensajes: 38
Antigüedad: 14 años
Puntos: 0
Respuesta: Saldos dinamicos

Tambien se me ocurrio esta consulta, pero me arroja este error. (creo que me falta un detalle, pero no lo se aplicar :( )

Mens. 512, Nivel 16, Estado 1, Línea 23
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.


DECLARE @intinicial int, @intfinal int, @fecha_exist_inicial datetime,@fecha_exist_final datetime

set @fecha_exist_inicial = '01-11-2010' set @fecha_exist_final = '20-11-2010'
set @intinicial = '1' set @intfinal = '170319'

SELECT @fecha_exist_final AS FECHA_SALDO, CODIGO, SUM(CANTIDAD) AS ENTRADAS,
(SELECT SUM(CANTIDAD) AS SALIDAS
FROM REGISTROS AS reg
WHERE (CODIGO BETWEEN @intinicial AND @intfinal) AND (FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND @fecha_exist_final) AND
(TIPO_MOV = 2) AND (CODIGO = CODIGO)
GROUP BY CODIGO) AS SALIDAS,SUM(CANTIDAD) - (SELECT SUM(CANTIDAD) AS SALIDAS
FROM REGISTROS AS reg
WHERE (CODIGO BETWEEN @intinicial AND @intfinal) AND (FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND @fecha_exist_final) AND
(TIPO_MOV = 2) AND (CODIGO = CODIGO)
GROUP BY CODIGO) AS SALDO
FROM REGISTROS AS reg
WHERE (CODIGO BETWEEN @intinicial AND @intfinal) AND (FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND @fecha_exist_final) AND (TIPO_MOV = 1)
GROUP BY CODIGO
  #3 (permalink)  
Antiguo 20/12/2010, 12:57
 
Fecha de Ingreso: abril-2010
Mensajes: 38
Antigüedad: 14 años
Puntos: 0
Respuesta: Saldos dinamicos

Compañeros, increible he podido dar con la solucion, la cual consiste en la siguiente.

1.- hacer un distinct a la columna codigo y hacerle un fulll
2.- mezclarla con las salidas y entradas
3.- en caso de tener null, reemplazarlas por 0

por siaca este es el codigo que me funciona, cualquier otra propuesta bienvenida sera


SELECT DISTINCT
REGISTROS.CODIGO, ISNULL(ENTRADAS.ENTRADAS, 0) AS ENTRADAS, ISNULL(SALIDAS.SALIDAS, 0) AS SALIDAS, ISNULL(ENTRADAS.ENTRADAS, 0)
- ISNULL(SALIDAS.SALIDAS, 0) AS SALDO
FROM REGISTROS FULL OUTER JOIN
(SELECT CODIGO, SUM(CANTIDAD) AS ENTRADAS
FROM REGISTROS AS reg
WHERE (CODIGO BETWEEN @intinicial AND @intfinal) AND (FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND @fecha_exist_final) AND
(TIPO_MOV = 1) AND (CODIGO = CODIGO)
GROUP BY CODIGO) AS ENTRADAS ON ENTRADAS.CODIGO = REGISTROS.CODIGO FULL OUTER JOIN
(SELECT CODIGO, SUM(CANTIDAD) AS SALIDAS
FROM REGISTROS AS reg
WHERE (CODIGO BETWEEN @intinicial AND @intfinal) AND (FECHA_REGISTRO BETWEEN @fecha_exist_inicial AND @fecha_exist_final) AND
(TIPO_MOV = 2) AND (CODIGO = CODIGO)
GROUP BY CODIGO) AS SALIDAS ON SALIDAS.CODIGO = REGISTROS.CODIGO

Etiquetas: dinamicos, saldos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:11.