我有一个包含库存、日期、数量和成本的库存交易汇总表 (tran)。主键是股票和日期;日期字段是普通键。问题是负面的,收据是正面的。每张收据的成本值都会发生变化。要查找库存编号(或任何日期)的当前成本非常简单且几乎是即时的:
select cost from tran
where stock = 12345 AND date <= 20140518
order by date desc limit 1;
我的问题是试图查看任何时间段的状态报告:
create temp
(stock int primary key,qty int,cost decimal(9,2));
insert into temp(stock,qty,cost)
select stock,sum(qty),cost from tran
where date <= 20140430
group by stock order by date desc;
库存状态数量正确,成本不正确。我已经尝试了很多方法来获得不同的成本和唯一有效的方法:
create temp2
(stock2 int primary key,cost2 decimal(9,3));
insert ignore into temp2
select stock,cost from tran
where date <= 20140430 order by date desc;
update temp inner join temp2
on stock = stock2 set cost = cost2;
“插入忽略”需要很长时间。有没有一种方法可以使用连接或子查询来做到这一点?实际生产表超过一百万条记录,上面的temp表是1900条记录,temp2表是14000条(不同库存项目的实际数量)。
预先感谢您的协助。
问候
艾德夏普
最佳答案
假设我没有正确理解你的问题,你正在尝试获取 stock
、sum(qty)
和最近的 cost
按日期?如果是这样,一种选择是使用相关子查询:
insert into temp(stock,qty,cost)
select t.stock,
sum(t.qty),
(select cost from tran t2 where t2.stock = t.stock and t2.date = max(t.date))
from tran t
where t.date <= 20140430
group by t.stock
order by t.date desc;
您还可以使用与原始查询类似的内容:
insert into temp(stock,qty,cost)
select t.stock,
sum(t.qty),
(select cost
from tran t2
where t2.stock = t.stock and
t2.date <= 20140430
order by t2.date desc
limit 1)
from tran t
where t.date <= 20140430
group by t.stock
order by t.date desc;
顺便说一下,您的第一次尝试没有正常工作,因为您没有按成本分组并且 mysql 返回了一个任意值。大多数其他 RDBMS 要求 select 语句中的所有字段在分组依据或聚合中定义。
关于Mysql:尝试从许多成本表中更新成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23723873/