Mysql:尝试从许多成本表中更新成本

标签 mysql

我有一个包含库存、日期、数量和成本的库存交易汇总表 (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条(不同库存项目的实际数量)。

预先感谢您的协助。

问候

艾德夏普

最佳答案

假设我没有正确理解你的问题,你正在尝试获取 stocksum(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/

相关文章:

php - 错误 1005 (HY000) : Can't create table 'db.POSTS' (errno: 150)

mysql - 通过 SQL JOINS 获取每个团队的成员

php - 从数据库中检索图像文件位置不显示

php - 什么可以使更新查询不更新但返回成功

php - 在 mysql 中插入一个 PHP false

MySQL select with IN (include) and NOT IN (exclude)

php - PHP 中的 PDO 过于复杂?

php - 在另一个查询中使用查询结果

php - PHP多级登录

mysql - 无法写入重复键,使用组合主键