解释有点长,但我想让我尽可能详细地了解问题。我有4个表,2个表示所用材料和返回材料的信息(Transactions
和Return
s),另外2个tablan详细说明了使用或返回的材料(Trans_det1
和Devol_det1
)
boletas
(门票)详细介绍了使用或不使用的每种材料,这些材料按工作单详细说明,例如:
我有以下句子:
--REGISTRATION OF INCOME
SELECT*FROM Transa WHERE orden='GORE-999888'
--REGISTRATION OF RETURNS
SELECT*FROM Devol WHERE orden='GORE-999888'
它返回:
Transa
表返回用于该订单和Devol
的所有票证,但显示了用于返回物料的boletas
(票证)。
材料细节
--WHAT WAS USED
SELECT Transa_det1.boleta, Transa_det1.rollo, Transa_det1.cantidad FROM Transa_det1,Transa
WHERE Transa.boleta=Transa_det1.boleta AND orden='GORE-999888'
--WHAT WAS RETURNED
SELECT Devol_det1.boleta, Devol_det1.rollo, Devol_det1.cantidad FROM Devol_det1, Devol
WHERE Devol_det1.boleta=Devol.boleta AND orden='GORE-999888'
它返回:
它返回订单XXXX中使用的rollos
以及使用了多少,第二个表显示了返回的rollos
的数量。
我的问题,对于RT0102
rollo
我使用100.5
然后我返回100
最后我真正使用的是0.5
,同样的RT0103
使用250
然后我返回50
,有一种方法做减法如果rollo
匹配而它们在一个查询中的顺序相同吗?我的意思是我需要一种方法来回报这个:
RT0103 0.5
RT0102 200
FH0091 465.75 //DON'T SUFFER CHANGES BECAUSE I DIDN'T RETURN THIS MATERIAL
你可以像下面这样使用OUTER APPLY
。
SELECT td.boleta,
td.rollo,
td.cantidad,
( td.cantidad - Isnull(c.ret, 0) ) AS Returned
FROM transa_det1 td
INNER JOIN transa ta
ON ta.boleta = td.boleta
OUTER apply (SELECT top 1 d1.cantidad AS Ret
FROM devol_det1 d1
INNER JOIN devol d
ON d1.boleta = d.boleta
WHERE d1.rollo = td.rollo and d.orden=ta.orden)c
where ta.orden = 'GORE-999888'
一个建议,总是使用JOINS
,这使您的查询更具可读性,并使其看起来非常清楚哪个连接对应于哪个条件。
下面是获取预期结果的查询,您可以使用case语句
select t1.rollo,
case when t2.cantidad is null then 0 // if canditad does not have value in DevolDtl then return 0 else do the subtraction
else t1.cantidad-t2,canditad end as result from
(
SELECT Transa_det1.boleta, Transa_det1.rollo, Transa_det1.cantidad FROM Transa_det1,Transa
WHERE Transa.boleta=Transa_det1.boleta AND orden='GORE-999888') t1
left outer join
(
SELECT Devol_det1.boleta, Devol_det1.rollo, Devol_det1.cantidad FROM Devol_det1, Devol
WHERE Devol_det1.boleta=Devol.boleta AND orden='GORE-999888') t2
on t1.boleta=t2.boleta;