- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 6000 件库存商品,库存分为 2 个批处理,分别为 4000 件和 2000 件。
根据销售订单,我试图预测哪一批库存可以满足每个订单。
例如:
SELECT product, order_qty, price, date_required FROM orders Where product = 'X'
这会产生这张表:
product | order_qty | price | date_required
------------------------------------------------------
X | 300 | 1.01 | 01/07/2018
X | 500 | 1.00 | 03/07/2018
X | 700 | 1.05 | 02/07/2018
X | 1000 | 1.00 | 01/08/2018
X | 2000 | 1.00 | 20/07/2018
X | 600 | 1.06 | 10/07/2018
X | 500 | 1.10 | 11/07/2018
X | 400 | 1.00 | 10/08/2018
然后我有另一个查询例如:
SELECT batch, product, qty, date_received FROM batches where product = 'X'
这将生成如下表格:
batch |product| qty | date_received
-------------------------------------------
ABC123 | X | 2000 | 01/04/2018
987ZYX | X | 4000 | 01/01/2018
因此,我想使用这两个表来预测将从哪一批库存订单中挑选。库存使用 FIFO 系统,因此根据表格,它必须首先使用批处理代码 987ZYX 批处理来完成订单。我正在寻找将其生成为表的查询:
product | order_qty | price | date_required| batch
------------------------------------------------------------------
X | 300 | 1.01 | 01/07/2018 | 987ZYX
X | 500 | 1.00 | 03/07/2018 | 987ZYX
X | 700 | 1.05 | 02/07/2018 | 987ZYX
X | 1000 | 1.00 | 01/08/2018 | ABC123
X | 2000 | 1.00 | 20/07/2018 | 987ZYX & ABC123
X | 600 | 1.06 | 10/07/2018 | 987ZYX
X | 500 | 1.10 | 11/07/2018 | 987ZYX
X | 400 | 1.00 | 10/08/2018 | ABC123
我已经根据要求的日期选择了上面的批处理,例如,需要的第一个订单是 1/7/18 这样将从批处理 987ZYX 中删除 300 件,然后我继续使用此方法直到我必须完成下一批的订单
我知道我可以使用 SUM over 方法,但我如何使用它来确保它不会使用比批处理中可用的库存更多的库存,正如您在上面看到的那样我想显示两个批处理如果如果需要从两个中完成,则可能。
最佳答案
首先,我讨厌日期(部分原因是我的生日是 2 月 29 日,部分原因是我的 'd' 键不能正常工作),所以我为每个订单和每个批处理创建索引,并且我认为应该处理订单从最小可能的批处理索引开始按索引的升序排列。我也不会在下订单时检查商品是否有货,以及许多其他事情。
正如@GordonLinoff 所建议的,我们将使用累计和。我为表 #orders 和 #batch 创建了具有累积数量的新表(我们只是总结了订单/批处理的所有数量,id 为当前)。然后我们递归地计算批处理......好吧,我们以某种方式找到了必要的批处理。我想我们不需要递归,但我只是学会了如何在 SQL 中使用它,所以我很自豪能在不需要的地方使用它。哦,我也忘了检查批处理和订单中的产品是否相同......
drop table if exists #orders, #batch, #orders_cumulative, #batch_cumulative
create table #orders (id int, product varchar(10), order_qty int, price float, date_required date)
insert into #orders VALUES
(1, 'x', 300, 1.01, '20180107'),
(2, 'y', 500, 1, '20180307'),
(3, 'x', 700, 1.05, '20180207'),
(4, 'x', 1000, 1, '20180108'),
(5, 'x', 2000, 1, '20180402'),
(6, 'x', 600, 1.06, '20180302'),
(7, 'y', 100, 1, '20180203'),
(8, 'x', 100, 1, '20180402')
create table #batch (id int, batch varchar(10), product varchar(10), qty int)
insert into #batch VALUES
(1, 'abc', 'x', 1000),
(2, 'zxc', 'x', 1000),
(3, 'sd', 'x', 2000),
(4, 'eiso', 'y', 10000)
SELECT o.*
,(select sum(order_qty) from #orders where id <= o.id and product = o.product) cumulative_qty
INTO #orders_cumulative
from #orders o
select b.*
,isnull((select sum(qty) from #batch where id < b.id and product = b.product), 0) cumulative_ex_qty
,(select sum(qty) from #batch where id <= b.id and product = b.product) cumulative_qty
into #batch_cumulative
FROM #batch b
select top 10 * from #orders_cumulative
select top 10 * from #batch_cumulative
select oc.*
,case when bc.cumulative_ex_qty > oc.cumulative_qty - oc.order_qty then convert(varchar(10), isnull(b1.batch, '') + ', ' + b2.batch) else b2.batch end batch
from #orders_cumulative oc
join #batch_cumulative bc on oc.cumulative_qty between bc.cumulative_ex_qty and bc.cumulative_qty and oc.product = bc.product
join #batch b2 on b2.id = bc.id
left JOIN #batch b1 on b1.id = bc.id - 1
编辑:除了将日期时间更改为 id 之外,我更正了主要问题(每个产品的单独计算,消除了愚蠢的递归)。
关于分区上的 SQL Sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51104825/
我有这个示例代码: #include #include int main() { Eigen::MatrixXf M = Eigen::MatrixXf::Random(1000, 1000)
我有一个像这样的数据框: +-----+--------+ |count| country| +-----+--------+ | 12| Ireland| | 5|Thailand| +-
我想要 SUM(tot_bill_1+tot_bill_2) AS 总计,但这不起作用 SELECT *, IF(SUM(bill_1) IS NULL, '99', SUM(bill_1)) AS
如果我们有两个矩阵 X 和 Y,都是二维的,现在在数学上我们可以说:sum(X-Y)=sum(X)-总和(Y). Matlab 哪个效率更高?哪个更快? 最佳答案 在我的机器上,sum(x-y) 对于
我正在运行 Hive 1.1.0 并看到对于两个 bigint 列,active_users 和 inactive_users,SUM(active_users + inactive_users) <
是否可以在一个选择查询中求和? 类似这样的事情: SELECT id, SUM(current_price - bought_price)*amount AS profit FROM purchase
这是一个相当奇怪的结果。我希望这些具有相同的产量。 下面还有从数据库中提取的 excel 链接。 https://twentius.opendrive.com/files?89038281_muoyg
我必须对 2 个字段求和,然后再求和。从性能的角度来看,先添加字段还是在对列求和之后添加字段有什么区别? 方法 1 = SELECT SUM(columnA + columnB) 方法 2 = SEL
这是一个经典问题,但我很好奇是否有可能在这些条件下做得更好。 问题:假设我们有一个长度为4*N的排序数组,即每个元素重复4次。请注意,N 可以是任何自然数。此外,数组中的每个元素都受制于 0 A. 执
我正在编写一个 Pig 程序,该程序加载一个用制表符分隔整个文件的文件 例如:名称 TAB 年份 TAB 计数 TAB... file = LOAD 'file.csv' USING PigStora
我有一个包含以下字段的表: EmpID, Code, Amount, TransDate, CM, CMDate 我想要进入数据网格的是 SUM所有的Amount具有相同的 Code和 SUM CM具
我有两个单独的查询用于提取报告信息。一年效果很好。但是,如果一个月超过 1 年,则不会显示正确的响应。 这是我的两个查询: select SUM(rpt_complete.total) total,
我想查询一个团队的积分。通过在列上执行 SUM + 来自具有相同团队 ID 的另一个表的 SUM 来添加这些点。我试着这样写: SELECT k.id, s.fylke, s.
这个问题在这里已经有了答案: How to deal with floating point number precision in JavaScript? (47 个回答) Unexpected
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 5 年前。 Improve
我已经找了一段时间,但找不到这个问题的答案(也许我没有搜索正确的术语或其他东西)。基本上,我有一个数据库,每个日期有任意数量的条目。我需要取包含条目的最后 X 天的总和(忽略没有条目的天数)。我知道如
我正在尝试获取 B 行中包含 A 行中某个值的所有值中的一些值。我猜这个问题很简单。 这是我的查询: =QUERY('Sheet1'!$A$16:D, "Select sum(D) Where C c
我正在尝试运行以下查询,但出现以下错误: You have an error in your SQL syntax; check the manual that corresponds to your
我有一个 tableA,其中包含以下结构 我将此结构修改为如下所示的tableB,以减少行数,并且类别是固定长度的 假设我在 tableA 中修改为新结构后有 210 万条数据,tableB 仅包含
我的表在 Postgres 中的数据: id user_id sell_amount sell_currency_id buy_amount buy_currency_id type
我是一名优秀的程序员,十分优秀!