Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql:尝试从包含许多成本的表中更新成本_Mysql - Fatal编程技术网

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

Mysql:尝试从包含许多成本的表中更新成本,mysql,Mysql,我有一个包含库存、日期、数量和成本的库存交易汇总表tran。主键是库存和日期;日期字段是一个普通键。发行量为负,收益为正。每次收据上的成本值都会发生变化。查找股票编号或任何日期的当前成本非常简单且几乎是即时的: select cost from tran where stock = 12345 AND date <= 20140518 order by date desc limit 1; 我的问题是尝试查看任何时间段的状态报告: create temp (stock

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

提前感谢您的帮助

问候


Ed Sharp

您需要定义一段时间内的成本。首先想到的是avg:

或者,也许是加权平均数:

  select stock, sum(qty), sum(cost * qty) / sum(qty)
  from tran 
  where date <= 20140430 
  group by stock
  order by 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 = 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语句中的所有字段在组中由或在聚合中定义。

您需要进一步解释您试图检索的不同成本。这是平均成本、上次输入的成本还是其他成本?谢谢您的快速回复。你的解决方案正是我想要的。有了980000条记录,临时表仅在2.6秒内创建。我曾想过一个sub_查询,但不知道如何做。再次感谢大家。
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;