Principales respuestas
Problema de Vista SQL Server

Pregunta
-
Tengo esta vista:
CREATE VIEW Existencias AS WITH Movimientos (Id, FechaOperacion, Producto, Cantidad) AS ( SELECT Numero, FechaCompra [FechaOperacion], Descripcion [Producto], CantidadCompra [Cantidad] FROM DetalleCompra UNION ALL SELECT CodFactura, FechaVenta, Descripcion [Producto], CantidadVenta * -1 [Cantidad] FROM DetalleVentas ) SELECT t1.FechaOperacion, t1.Producto, CASE WHEN t1.Cantidad > 0 THEN t1.Cantidad END [Comprado], CASE WHEN t1.Cantidad < 0 THEN ABS(t1.Cantidad) END [Vendido], SUM(t1.Cantidad) OVER(PARTITION BY t1.Producto ORDER BY t1.Id, t1.Id) [Saldo] FROM Movimientos t1
Trabaja bien el problema se da cuando yo hago por ejemplo:
que se ordena por fecha y sale valor negativo y no deberia verse asi. Que esta faltando ?
Saludos
PD. Se que esto va en la seccion SQL pero ya cuando me di cuenta no lo pude mover.
- Editado Javier Roque viernes, 5 de enero de 2018 14:27
Respuestas
-
Los valores de la columna 'FechaOperacion' no determinan secuencia en el orden porque hay valores repetidos, quizá debas combinar el orden junto con la columna 'Id', por ejemplo:
SUM(t1.Cantidad) OVER(PARTITION BY t1.Producto ORDER BY t1.FechaOperacion, t1.Id) [Saldo]
- Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:45
-
Hola,
Deberias ordenar los movimientos por fecha y dentro de la fecha por algun otro dato dependiendo de como identificas al movimiento.
Es muy comun que en las empresas primero se registren las salidas y luego las entradas. Es decir si no son algo prolijos para las cosas va a ser dificil que la infomacion sea confiable o refleje la realidad.
Una solucion posible es guardar en cada registro un dato que identifique si es entrada "E" o salida "S". entonces si ordenas por fecha + ese dato, para una misma fecha tendrias primero las entradas y luego las salidas, pero eso no siempre es asi, podes tener excepciones, hay que ver lo que pretende tu cliente.
Una cosa es saber que saldo de stock habia en cieto momento, puede ser a nivel de hora y minuto, y otra que saldo habia al final del dia. Para el primer caso la cosa es dificil de solucionar si no hay un poco de prolijidad en el cliente, para el segundo no importa si registran, para un mismo dia, primero las salidas y luego las entradas total al final del dia el saldo sera el correcto. Claro que a nivel de renglon puede ser que alguno posea saldo en negativo.
Victor Koch
- Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:44
Todas las respuestas
-
Los valores de la columna 'FechaOperacion' no determinan secuencia en el orden porque hay valores repetidos, quizá debas combinar el orden junto con la columna 'Id', por ejemplo:
SUM(t1.Cantidad) OVER(PARTITION BY t1.Producto ORDER BY t1.FechaOperacion, t1.Id) [Saldo]
- Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:45
-
Hola, Gracias por contestar,
He probado eso y sale igual. Le quite t1.FechaOperacion parece que por interno hace el Id, pero se ve igual sin el valor negativo pero no se ve bien de todas formas
- Editado Javier Roque viernes, 5 de enero de 2018 14:48
-
He probado eso y sale igual no muestra ID
Agradeceré seas algo mas explicito en tus respuestas.
La intención de la instrucción sugerida no es que muestre la columna 'Id', de hecho no se va a mostrar porque no forma parte de la lista de selección. Propuse combinar el orden para determinar una secuencia basada en la fecha y en el correlativo de la operación. Por otro lado, utiliza los mismos criterios de orden que ocupaste en la cláusula OVER() para la cláusula ORDER BY externa.
-
Disculpa de echo borre esa respuesta antes y como mencione es algo por interno que toma el orden Id pero de igual forma sale lo mismo pero a mi parece es un error interno de las fechas creo ya que al inicio el datetimepicker esta tomandome fechas pasadas por defecto y como me olvido de indicarlo creo lo tomare de otra modo
-
Buen dia,
Supongo que el ID debe ser un autonumerico. Si te fijas en FechaOperacion primero fue registrado el egreso y luego el ingreso. Entiendo que esos movimientos fueron registrados en esas fecha por lo tanto es correcto que el ingreso posea in ID superior al egreso.
Los resultados que obtenes son correctos.
Victor Koch
-
?¿ Bueno suponiendo no cuentes con material entonces hoy compras dicho material y mañana o pasado posiblemente lo vendes entonces Primero es la compra y luego es la venta.
Entonces para lo que me comentas es por decirlo que si ese material lo compre hace meses atras y hoy lo vendo la venta es primero segun la fecha. Pero si es que tienes stock y si no?
Haciendo como que haga todo un mismo dia esto se ve asi pero hay un detalle a pesar que todo parece verse bien hay un item que no.
Entonces de que manera esta tomando la fecha ? para ordenar por la hora ? esos 50 de compra lo hice el mismo dia pero minutos antes que venda 1 .
-
Hola,
Deberias ordenar los movimientos por fecha y dentro de la fecha por algun otro dato dependiendo de como identificas al movimiento.
Es muy comun que en las empresas primero se registren las salidas y luego las entradas. Es decir si no son algo prolijos para las cosas va a ser dificil que la infomacion sea confiable o refleje la realidad.
Una solucion posible es guardar en cada registro un dato que identifique si es entrada "E" o salida "S". entonces si ordenas por fecha + ese dato, para una misma fecha tendrias primero las entradas y luego las salidas, pero eso no siempre es asi, podes tener excepciones, hay que ver lo que pretende tu cliente.
Una cosa es saber que saldo de stock habia en cieto momento, puede ser a nivel de hora y minuto, y otra que saldo habia al final del dia. Para el primer caso la cosa es dificil de solucionar si no hay un poco de prolijidad en el cliente, para el segundo no importa si registran, para un mismo dia, primero las salidas y luego las entradas total al final del dia el saldo sera el correcto. Claro que a nivel de renglon puede ser que alguno posea saldo en negativo.
Victor Koch
- Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:44
-
Lo analizare y te comento. Bueno te marcare la respuesta ya que es una idea extra posible de realizar.
Gracias
- Editado Javier Roque miércoles, 10 de enero de 2018 4:44
-
-