我在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)
显示每张发票上的订购数量和实际数量之间的差异.我不知道如何开始.任何帮助深深感激:)
具有简单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上演示
因此,首先您必须通过进行 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