SQL - Restar valores entre dos tablas y mostrar existencias

 
Vista:
sin imagen de perfil

Restar valores entre dos tablas y mostrar existencias

Publicado por Mauro (1 intervención) el 25/05/2022 02:32:44
Hola Amigos. Estoy con dificultad en una consulta en MSSQL que a priori parece sencilla pero no doy en la tecla, estoy un poco oxidado en SQL.
Tengo dos tablas, Stock y Salidas, ambas comparten IdProducto. En la tabla Stock hay una existencia de cada producto que a medida que el producto sale, se va generando un registro en la tabla Salidas con el IdProducto y la cantidad que sale, junto con un IdSalida que identifica la salida:

Tabla Stock:
+---------------+------------+-----------------+
| IdPoducto | Nombre | CantOriginal |
+---------------+- ----------+-----------------+
| 1 | Prod1 | 9 |
| 2 | Prod2 | 20 |
| 3 | Prod3 | 10 |
| 4 | Prod4 | 18 |
| 5 | Prod5 | 20 |
| 6 | Prod6 | 19 |
| 7 | Prod7 | 25 |
| 8 | Prod8 | 15 |
| 9 | Prod9 | 15 |
+---------------+------------+-----------------+

Tabla Salidas:
+---------------+------------+-----------------------+
| IdProducto | IdSalida | CantDescontada |
+---------------+- ----------+-----------------------+
| 1 | 1 | 9 |
| 2 | 1 | 20 |
| 4 | 1 | 5 |
| 4 | 2 | 4 |
| 5 | 1 | 19 |
| 9 | 1 | 10 |
+---------------+------------+-----------------------+

Lo que necesito es generar una consulta donde se muestren los IdProducto que aun tengan alguna cantidad, sería una tabla Existencias, por ejemplo, algo así:

+---------------+------------+-----------------+
| IdPoducto | Nombre | CantStock |
+---------------+- ----------+-----------------+
| 3 | Prod3 | 10 |
| 4 | Prod4 | 9 |
| 5 | Prod5 | 1 |
| 6 | Prod6 | 19 |
| 7 | Prod7 | 25 |
| 8 | Prod8 | 15 |
| 9 | Prod9 | 5 |
+---------------+------------+-----------------+

Probé con:

SELECT * FROM Stock WHERE IdProducto NOT IN (
SELECT IdProducto FROM Salidas)

pero el resultado no muestra las que al menos tiene una existencia:
+---------------+------------+-----------------+
| IdPoducto | Nombre | CantStock |
+---------------+- ----------+-----------------+
| 3 | Prod3 | 10 |
| 6 | Prod6 | 19 |
| 7 | Prod7 | 25 |
| 8 | Prod8 | 15 |
+---------------+------------+-----------------+

Muchas gracias por la ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Restar valores entre dos tablas y mostrar existencias

Publicado por gilman (103 intervenciones) el 25/05/2022 07:49:11
A pesar de que tienes mal planteada la base de datos ya que la tabla Stock debería actualizar la cantidad con cada salida, esta sentencia debería funcionar:
1
2
3
4
5
6
7
8
9
SELECT Stock.IdProducto,
       Stock.Nombre,
       Stock.CantOriginal - TotalSalidas.DescuentoTotal CantStock
  FROM stock
       INNER JOIN (  SELECT IdProducto, SUM (CantDescontada) DescuentoTotal
                       FROM Salidas
                   GROUP BY IdProducto) TotalSalidas
          ON Stock.IdProducto = TotalSalidas.IdProducto
 WHERE Stock.CantOriginal - TotalSalidas.DescuentoTotal <> 0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar