Sql 两个表的存货余额

Sql 两个表的存货余额,sql,sql-server,Sql,Sql Server,我在SQL Server中有两个表,第一个用于库存,第二个用于库存移动。我需要一个查询来显示每个序列号的剩余原材料,以及是否有移动 表1 +----------+------------+-----+ | CodeRaw | Serial_Raw | Qty | +----------+------------+-----+ | 1 | 1 | 100 | | 1 | 2 | 150 | | 2 |

我在SQL Server中有两个表,第一个用于库存,第二个用于库存移动。我需要一个查询来显示每个序列号的剩余原材料,以及是否有移动

表1

+----------+------------+-----+
| CodeRaw  | Serial_Raw | Qty |
+----------+------------+-----+
|        1 |          1 | 100 |
|        1 |          2 | 150 |
|        2 |          1 |  80 |
|        1 |          3 | 100 |
|        1 |          4 | 100 |
+----------+------------+-----+
和表2

+------------+----------+------------+----------+--+
| CodeBatch  | CodeRaw  | Serial_Raw | Qty_Added|  |
+------------+----------+------------+----------+--+
|          1 |        1 |          1 |       80 |  |
|          2 |        1 |          1 |       10 |  |
|          3 |        1 |          2 |      150 |  |
|          4 |        1 |          3 |       80 |  |
+------------+----------+------------+----------+--+
我已经尝试了一些代码,但我只是在有库存移动的情况下得到了结果,没有显示特定原始数据(code_raw)的所有QT

也许我错过了什么

这就是我的疑问


declare @tbl1 table (CodeRaw INT, Serial_Raw INT, Qty INT)
declare @tbl2 table (CodeBatch INT, CodeRaw INT, Serial_Raw INT, QtyAdded INT)

insert into @tbl1 values (1,1,100), (1,2,150), (2,1,80), (1,3,100),(1,4,100)
insert into @tbl2 values (1,1,1,80), (2,1,1,10), (3,1,2,150), (4,1,3,80)

  SELECT t2.Serial_Raw, t1.Qty - t2.QtyAdded AS Total_Remaining  FROM @tbl1 t1
        INNER JOIN (SELECT CodeRaw, Serial_Raw , SUM(QtyAdded) QtyAdded FROM @tbl2
                    GROUP BY CodeRaw, Serial_Raw) AS t2 ON t2.CodeRaw = t1.CodeRaw AND t1.Serial_Raw = t2.Serial_Raw
    WHERE t1.CodeRaw = 1   
我预料

Serial_Raw  Total_Remaining 
----------  --------------- 
1           10  
2            0  
3           20 
4           100
但结果是

Serial_Raw  Total_Remaining 
----------  --------------- 
1           10  
2            0  
3           20    

提前感谢

使用左外部联接代替内部联接,也可以使用左表中的ISNULL和serial_Raw

declare @tbl1 table (CodeRaw INT, Serial_Raw INT, Qty INT)
declare @tbl2 table (CodeBatch INT, CodeRaw INT, Serial_Raw INT, QtyAdded INT)

insert into @tbl1 values (1,1,100), (1,2,150), (2,1,80), (1,3,100),(1,4,100)
insert into @tbl2 values (1,1,1,80), (2,1,1,10), (3,1,2,150), (4,1,3,80)

  SELECT t1.Serial_Raw, t1.Qty - ISNULL(t2.QtyAdded,0) AS Total_Remaining  FROM @tbl1 t1
        LEFT OUTER JOIN (SELECT CodeRaw, Serial_Raw , SUM(QtyAdded) QtyAdded FROM @tbl2
                    GROUP BY CodeRaw, Serial_Raw) AS t2 

                    ON t2.CodeRaw = t1.CodeRaw AND t1.Serial_Raw = t2.Serial_Raw
    WHERE t1.CodeRaw = 1  
结果:

Serial_Raw  Total_Remaining
----------- ---------------
1           10
2           0
3           20
4           100

我认为你的问题在于你的
内部连接。只返回两个表中的库存结果。也就是说,如果某个项目没有库存变动,则不返回总计数

步骤1:
内部连接切换到
左侧外部连接
。这将返回库存表中的所有结果(
tbl1
),即使它没有移动(
tbl2
)。另外,如果从
JOIN
返回空值,请从
tbl1
中选择
Serial\u Raw
,而不是
tbl2

步骤2:步骤1将为
JOIN
中添加的
tbl2.QtyAdded
返回
NULL
。为此,您可以使用
ISNULL(tbl2.QtyAdded,0)
在计算中执行空检查。然后,如果没有添加的
QtyAdded
,则
tbl1.Qty
将减去0(保持不变)

结果代码:

declare @tbl1 table (CodeRaw INT, Serial_Raw INT, Qty INT)
declare @tbl2 table (CodeBatch INT, CodeRaw INT, Serial_Raw INT, QtyAdded INT)

insert into @tbl1 values (1,1,100), (1,2,150), (2,1,80), (1,3,100),(1,4,100)
insert into @tbl2 values (1,1,1,80), (2,1,1,10), (3,1,2,150), (4,1,3,80)

  SELECT t1.Serial_Raw, t1.Qty - ISNULL(t2.QtyAdded, 0) AS Total_Remaining  FROM @tbl1 t1
        LEFT OUTER JOIN (SELECT CodeRaw, Serial_Raw , SUM(QtyAdded) QtyAdded FROM @tbl2
                    GROUP BY CodeRaw, Serial_Raw) AS t2 ON t2.CodeRaw = t1.CodeRaw 
                         AND t1.Serial_Raw = t2.Serial_Raw
    WHERE t1.CodeRaw = 1   
Serial_Raw  Total_Remaining
-----------------------------
1           10
2           0
3           20
4           100
结果:

declare @tbl1 table (CodeRaw INT, Serial_Raw INT, Qty INT)
declare @tbl2 table (CodeBatch INT, CodeRaw INT, Serial_Raw INT, QtyAdded INT)

insert into @tbl1 values (1,1,100), (1,2,150), (2,1,80), (1,3,100),(1,4,100)
insert into @tbl2 values (1,1,1,80), (2,1,1,10), (3,1,2,150), (4,1,3,80)

  SELECT t1.Serial_Raw, t1.Qty - ISNULL(t2.QtyAdded, 0) AS Total_Remaining  FROM @tbl1 t1
        LEFT OUTER JOIN (SELECT CodeRaw, Serial_Raw , SUM(QtyAdded) QtyAdded FROM @tbl2
                    GROUP BY CodeRaw, Serial_Raw) AS t2 ON t2.CodeRaw = t1.CodeRaw 
                         AND t1.Serial_Raw = t2.Serial_Raw
    WHERE t1.CodeRaw = 1   
Serial_Raw  Total_Remaining
-----------------------------
1           10
2           0
3           20
4           100

你需要做两个改变

  • 左键连接到第二个表
  • 检查第二个表的列是否为空,然后将减号设置为0