当X Element匹配时,在表之间减去数据

问题描述 投票:0回答:2

解释有点长,但我想让我尽可能详细地了解问题。我有4个表,2个表示所用材料和返回材料的信息(TransactionsReturns),另外2个tablan详细说明了使用或返回的材料(Trans_det1Devol_det1

boletas(门票)详细介绍了使用或不使用的每种材料,这些材料按工作单详细说明,例如:

我有以下句子:

--REGISTRATION OF INCOME
SELECT*FROM Transa WHERE orden='GORE-999888'

--REGISTRATION OF RETURNS
SELECT*FROM Devol WHERE orden='GORE-999888'

它返回:

enter image description here

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'

它返回:

enter image description here

它返回订单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
c# sql
2个回答
1
投票

你可以像下面这样使用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,这使您的查询更具可读性,并使其看起来非常清楚哪个连接对应于哪个条件。


1
投票

下面是获取预期结果的查询,您可以使用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;
© www.soinside.com 2019 - 2024. All rights reserved.