所以使用这个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
因此,它基本上在库存表上创建了一个单独的方框列表(由点号唯一),以便从多个产品的第一个选择语句中填写订单。
答案 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支持),
这是一个包含cte
和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