如何 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
因此使用此 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