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

Consulta SQL

Estas en el tema de Consulta SQL en el foro de SQL Server en Foros del Web. hola, tengo una tabla de Movimientos que mediante el campo tipo indica si es salida o entrada (1 = entrada , 2= salida) , otros ...
  #1 (permalink)  
Antiguo 22/11/2006, 11:20
locorz
Invitado
 
Mensajes: n/a
Puntos:
Exclamación Consulta SQL

hola, tengo una tabla de Movimientos que mediante el campo tipo indica si es salida o entrada (1 = entrada , 2= salida) , otros dos con 2 cantidades (cantidad1 y cantidad2) y la fecha en la que se realizo

Me gustaria saber como puedo hacer una sql que me mueste entre dos fechas el saldo de los movimientos dia a dia que haya habido (entradas - salidas) y si un dia no ha habido que muestre 0.

Creo que es que se puede realizar con PIVOT pero no consigo que me muestre los dias que no hay ni entradas ni salidas el saldo 0.

Muchas gracias
  #2 (permalink)  
Antiguo 22/11/2006, 13:13
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Que tal.

Podrías por favor poner la estructura de tu tabla, o al menos los campos más releventes por favor, para poder ayudarte con mayor precisión.

Saludos!
  #3 (permalink)  
Antiguo 23/11/2006, 16:11
locorz
Invitado
 
Mensajes: n/a
Puntos:
Gracias por responder

Me gustaria saber si es posible crear una consulta para una tabla de movimientos que contiene los siguientes campos

Fecha Cant1 cant2 tipo (entrada o salida)
21/11/2006 1 2 1 = entrada.
21/11/2006 1 0 2 = salida
20/11/2006 3 0 1= entrada
20/11/2006 1 4 2= entrada
19/11/2006 1 2 1 = entrada

quesegun la seleccion entre fechas me muestre el saldo entre entradas y salida (la cant1 y cant2 se suman)

fecha saldo
21/11/2006 2
20/11/2006 -2
19/11/2006 3

Seria posible ademas que que si inndico desde fecha inicio 18/11/2006 y no ha habido movimiento ni de entrada ni salida mostrase 0?

19/11/2006 0

Creo que lo primeros es posible, lo segundo ni idea

Muchas gracias
  #4 (permalink)  
Antiguo 23/11/2006, 16:48
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Que tal.

Usando tablas temporal y mucho Left Joins, es posible obtner el resultado que deseas.

Basandome en los datos que me proporcionaste te tengo lo siguiente:

Código:
-- A la tabla de movimientos la llamare tempMovim.
-- Esta tabla tiene únicamente los registros para el reporte (los que me pasaste)

-- Y solo usaré las fechas que me muestras de ejemplo.

-- Como primer paso creamos una tabla temporal.
-- Que contedra las fechas de los saldos que queremos consultar
create table #tempFechas
(
  IdRow int identity , 
  Fecha datetime 
)

-- Esto se puede hacer con ciclo while y la función dateadd ( como incrementador )
-- desde Fecha Ini hasta Fecha Fin.
-- Para efectos del ejemplo solo pondre las fechas que me muestras 
insert into #tempFechas 
select distinct Fecha  from tempMovim

-- Y agregaré otra más con datos que no existen.
insert into #tempFechas (fecha)
select '20061118'

select * from #tempFechas 

-- Juntamos las entradas en una tabla temporal #Tabla1
select t.fecha as Fecha,ISNULL( sum(Cant1+ cant2), 0 ) as CantidadE
into #tabla1
from #tempFechas  t LEFT OUTER  JOIN tempMovim m ON
	t.Fecha = m.Fecha
where Tipo = 1 OR  Tipo IS NULL
group by t.fecha


-- Juntamos las Salidas  en una tabla temporal #Tabla2
select t.fecha as Fecha,ISNULL( sum(Cant1+ cant2), 0 ) as CantidadS
into #tabla2
from #tempFechas  t LEFT OUTER  JOIN tempMovim m ON
	t.Fecha = m.Fecha
where Tipo = 2 OR  Tipo IS NULL
group by t.fecha


-- Por último cruzamos las entradas y las salidas y Listo!

SELECT t1.Fecha as Fecha, t1.CantidadE - ISNULL(t2.CantidadS,0) as Saldo
FROM #tabla1 t1 left outer join #tabla2 t2 ON
	t1.Fecha = t2.Fecha

-- Los resultados que obtuve son:
Fecha                                                  Saldo       
------------------------------------------------------ ----------- 
2006-11-18 00:00:00.000                                0
2006-11-19 00:00:00.000                                3
2006-11-20 00:00:00.000                                -2
2006-11-21 00:00:00.000                                2

(4 filas afectadas)

Saludos y cualquier duda, aquí se te amplía.
  #5 (permalink)  
Antiguo 24/11/2006, 02:18
locorz
Invitado
 
Mensajes: n/a
Puntos:
Muchas gracias por la respuesta.

En cuanto a las tablas temporales, al ser un proceso que voy a realizar habitualmente con cada cliente, no convendria tener unas tablas fijas para realizar el proceso y cuando acabe con cada cliente limpiarlas para realizarlo con el siguiente y asi evitar carga a la base de datos? si hay muchos movimientos no sera muy pesado?
  #6 (permalink)  
Antiguo 24/11/2006, 09:21
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Que tal.

Mientras tu servidor sea muy bueno(bastante memoria y hh) no creo que tenga mucha importancia lo de las tablas temporales, haciendo uso de tablas temporales te evitas el trabajo de la concurrencia, es decir, si más de un usuario ejecuta el proceso.

Puedes hacer uso de tablas fijas pero tendras que tomar el cuenta el hecho de que dos usuarios ( o más) quieran que usar el proceso.

Respecto al rendimiento, de que sean muchos registros tampoco importa, pero si es importante que el paso uno sea, pasar a una tabla temporal los registros que vas a trabajar, en este caso por eso use la tabla "tempMovim", esto con la finalidad de no accesar varias veces la tabla "Movimientos", que me imagino ha de tener "bastantes" registros.

Saludos y suerte!
  #7 (permalink)  
Antiguo 29/11/2006, 21:09
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Sonrisa Prueba esto

SELECT
E1.FECHA, (ISNULL(E1.CANT1, 0) + ISNULL(E1.CANT2, 0)) - (ISNULL(E2.CANT1, 0) + ISNULL(E2.CANT2, 0)) AS SALDO
FROM
TB_EJEMPLO E1
LEFT JOIN
TB_EJEMPLO E2
ON
E1.FECHA = E2.FECHA
AND
E1.TIPO = E2.TIPO - 1
WHERE
ISNULL(E2.TIPO, 2) <> ISNULL(E1.TIPO, 1)

para lo de las fechas que no se contengan en este set de resultados, tendrás que meter las fechas que quieres consultar en una tabla temporal y hacer un left contra esta vista

Saludos!
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 16:05.