首页 > 解决方案 > 将同一表上的 BOM 数量与 SQL Server 2012 进行比较

问题描述

我正在尝试在同一张表中获取 2 个产品之间的比较材料清单。我有一张BOM桌子

在此处输入图像描述

我想比较数量

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

SUPPLIERPN是独特的(ID, PRODUCT)组合

预期结果

在此处输入图像描述

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

我对基本查询的 SQL Server 语法知识,所以我不知道如何做到这一点。我试图搜索,但我不知道描述此类问题的正确术语。

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

标签: sqlsql-server

解决方案


没有 (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;

推荐阅读