如何根据另一个表中的数量从一个表中选择一定数量的行

时间:2015-06-17 13:02:58

标签: sql-server sql-server-2000

所以使用这个select语句(不包括连接和where子句)

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

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

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

我认为我需要使用select top...并使用order by来确定要挑选的方框的优先级,但无法想象如何获取数量。

以下是一些组成数据,因此上面选择的结果将与此

一致
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

因此,它基本上在库存表上创建了一个单独的方框列表(由点号唯一),以便从多个产品的第一个选择语句中填写订单。

1 个答案:

答案 0 :(得分:0)

创建样本数据(您应该自己完成该部分)

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 server 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 版本或更高版本(并且您真的应该自2000年以来升级您的sql不再受Microsoft支持), 这是一个包含cteROW_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