找出两组记录之间的差异

RRM*_*RRM 4 sql

我在sql server上有一组数据,如:

ID ID_Invoice Article Quantity Status
1  10         carrot  10       null
2  10         carrot  5        C
3  10         onion   8        null
4  10         onion   4        C
5  11         tomato  20       null
6  11         tomato  18       C
7  11         onion   2        null
8  11         onion   1        C
Run Code Online (Sandbox Code Playgroud)

这意味着客户订购了10个胡萝卜和8个洋葱(在一张发票上)但实际上只收到了5个胡萝卜和4个洋葱.如果status为null则为原始数量,如果status为C则为校正数量

我需要生成一个像这样的表

ID ID_Invoice Article Quantity 
1  10         carrot  -5       
2  10         onion   -4
3  11         tomato  -2
4  11         onion   -1
Run Code Online (Sandbox Code Playgroud)

显示每张发票上的订购数量和实际数量之间的差异.我不知道如何开始.任何帮助深深感激:)

Ale*_*nko 8

具有简单CASE表达式的选项,没有过多的JOIN

SELECT ID_Invoice, Article, 
       SUM(CASE WHEN Status IS NULL 
  THEN -1 * Quantity ELSE Quantity END) AS Quantity
FROM dbo.test38
GROUP BY ID_Invoice, Article
Run Code Online (Sandbox Code Playgroud)

结果:

ID_Invoice Article Quantity 
10  carrot  -5
10  onion   -4
11  onion   -1
11  tomato  -2
Run Code Online (Sandbox Code Playgroud)

SQLFiddle上演示


Mor*_*lus 1

因此,首先您必须通过进行 2 个查询将实际订单与订单分开,然后您必须将订单与实际订单连接起来..像这样

select 
   Recived.ID, 
   Recived.ID_Invoice,
   Recived.Article,
   Recived.Quantity - Ordered.Quantity as Quantity
from
   (select * from dataTable where Status is null) as Ordered
   left join (select * from  dataTable where Status = 'C')  as Recived on (Ordered.ID_Invoice = Recived.ID_Invoice and Ordered.Article = Recived.Article )
Run Code Online (Sandbox Code Playgroud)

笔记!如果您为每篇文章提供一个 id 以在“左连接”中使用而不是比较 varchar,那么您会更好。

这是一个小提琴示例: http://sqlfiddle.com/#!2/16666/1