使用SQL Server 2012比较同一表上的BOM数量

时间:2018-07-13 18:18:30

标签: sql sql-server

我试图在同一张表中比较两种产品的物料清单。我有一个BOM桌子

enter image description here

我想比较来自

的数量

PRODUCT A FROM ID=1PRODUCT CCC FROM ID=2

SUPPLIERPN对于(ID, PRODUCT)组合是唯一的

预期结果

enter image description here

我的问题:如何使用SQL获得预期的结果?

我的SQL Server语法知识适合基本查询,因此我不知道如何执行此操作。我尝试搜索,但不知道描述此类问题的正确术语。

通常,我在应用程序站点中解决了此类问题(从Database Server加载所有数据,然后进行比较)。

1 个答案:

答案 0 :(得分:1)

没有(CCC,555),因此该产品的预期输出不正确。老实说,如果您不能手动执行此操作并获得正确的输出,那么您会遇到更大的问题。此外,发布图像是一种提供信息的可怕的可怕方式。

但这是一种尝试纠正所有错误的解释。在写完它之后,我才发现您的pn是字符串而不是数字-这就是为什么用于填充表变量的文字没有引号的原因。

set nocount on;
declare @x table (salesid tinyint, product varchar(3), supplierpn varchar(5), qty decimal(5,2)); 
insert @x (salesid, product, supplierpn, qty) values
(1, 'A', 1234, 1), (1, 'A', 555, 2), (1, 'A', 666, 3), 
(1, 'BBB', 1234, 4), (1, 'BBB', 555, 5), 
(2, 'CCC', 1234, 6), (2, 'CCC', 666, 7), (2, 'CCC', 777, 8), (2, 'CCC', 888, 9) ; 
select * from @x order by salesid, product, qty;

with cte_a as (select supplierpn, qty from @x where salesid = 1 and product = 'A'), 
cte_ccc as (select supplierpn, qty from @x where salesid = 2 and product = 'CCC') 
select isnull(cte_a.supplierpn, cte_ccc.supplierpn) as supplierpn,
   cte_a.qty as qty_a, 
   cte_ccc.qty as qty_ccc, 
   isnull(cte_ccc.qty, 0) - isnull(cte_a.qty, 0) as delta 
from cte_a full join cte_ccc on cte_a.supplierpn = cte_ccc.supplierpn 
order by supplierpn;