如何 select 一个行的数量 table 基于另一个行的数量

How to select a quantity of rows from one table based on quantities from another

因此使用此 select 语句(不包括连接和 where 子句)

SELECT [ProductNo], (mf_btol.OrderedBoxes - mf_btol.ActualBoxes) as [Remaining], [DespatchOrderNo]

这给出了完成订单所需的剩余产品和箱子数量的列表。

我想要做的是 select 并从单独的库存中显示 table 基于每种产品需要多少的箱子记录数量,这样我就可以创建一个列表为订单挑选的箱子数量。

我想我需要使用 select top... 并使用 order by 来确定要挑选的箱子的优先级,但无法想象如何获得其中的数量。

这里是一些编造的数据,所以上面 select 的结果应该是这样的

ProductNo     Remaining      DespatchOrderNo
845121         3             6194
989222         2             6194

我想要的是

DOTNo     ProductNo      DespatchOrderNo
123456    845121         6194
123457    845121         6194
123458    845121         6194
124444    989222         6194
124445    989222         6194

因此,它基本上是在库存 table 上创建一个单独的盒子列表(按点号唯一)来填充多个产品的第一个 select 语句中的订单。

创建示例数据(您应该自己完成该部分)

CREATE TABLE a
(
ProductNo int,
OrderedBoxes int,
ActualBoxes int,
DespatchOrderNo int
)

INSERT INTO a VALUES
(845121, 5,2, 6194),
(989222, 3,1, 6194)

CREATE TABLE b
(
ProductNo int,
DOTNo int
)

INSERT INTO b VALUES
(845121, 123453),
(845121, 123454),
(845121, 123455),
(989222, 124442),
(989222, 124443)

更新:

假设它确实是 sql 服务器 2000,我认为(尽管无法测试)动态 sql 解决方案应该可行。类似这样(在我的2012版本上测试过,别以为这是2000做不到的)

DECLARE @Sql varchar(8000) = ''
SELECT @Sql = @Sql +
       'SELECT * FROM (SELECT TOP '+ CAST((OrderedBoxes - ActualBoxes) as varchar) + ' DOTNo, a.ProductNo, DespatchOrderNo 
       FROM a 
       INNER JOIN b ON(a.ProductNo = b.ProductNo)
       WHERE a.ProductNo = '+ CAST(a.ProductNo as varchar) +'
       ORDER BY DOTNo) iq UNION ALL ' 
FROM a 

SET @Sql = LEFT(@Sql, LEN(@Sql) - 10) -- remove the last union all

EXEC(@Sql)

对于 2008 版本或更高版本(您确实应该升级 sql,因为 Microsoft 不再支持 2000), 这是 cte and ROW_NUMBER 的一种解决方案:

WITH CTE AS (
SELECT OrderedBoxes - ActualBoxes As Remaining, 
       DOTNo, a.ProductNo, 
       DespatchOrderNo, 
       ROW_NUMBER() OVER(PARTITION BY a.ProductNo ORDER BY DOTNo) RN
FROM a INNER JOIN
b ON(a.ProductNo = b.ProductNo)
) 

SELECT DOTNo, ProductNo, DespatchOrderNo
FROM CTE
WHERE RN <= Remaining

输出:

DOTNo       ProductNo   DespatchOrderNo
----------- ----------- ---------------
123453      845121      6194
123454      845121      6194
123455      845121      6194
124442      989222      6194
124443      989222      6194