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