MySQL查询帮助 - 库存系统

时间:2016-01-18 14:21:26

标签: mysql sql

我很想知道如何编写这个查询,我希望有人可以指出我正确的方向。

我有一个管理资产的系统,有两个与此问题相关的表。项目,其中每个资产拥有一个记录,然后是item_activity,每次登记或检出存储区域时都存储记录。

我需要生成一份关于日期范围内任何时间点所持物品的报告(IE我们的存储在一年内看到的物品数量)。换句话说,我需要查看一年中存储在存储中的所有项目,无论它们存在多长时间(已签入状态)。您可以轻松查看我的活动表并查找在日期范围内签入的状态。我遇到的问题是捕捉在我的日期范围开始之前检查过的项目,并且在那一年没有移动。

这是我的架构

项目

  • id(主键)
  • 使
  • 模型
  • SERIAL_NUMBER
  • 等...

item_activity

  • ACTIVITY_ID
  • item_id(与项目表相关)
  • 状态(签入,签出,分配等)
  • 时间戳
  • 用户
  • 注释

我确定之前有人遇到过这种情况,但我似乎无法找到任何先前的问题,或者可能不知道用于查找问题的正确字词。谢谢您的帮助!我对SQL很新。

2 个答案:

答案 0 :(得分:0)

所有活动......

SELECT * 
FROM Item_Activity A
INNER JOIN Item I ON I.id = A.Item_ID
WHERE
   A.timestamp BETWEEN @YourStartDate AND @YourEndDate;

所有在2个日期之间有活动的项目都是......

SELECT I.* 
FROM Item I
INNER JOIN Item_Activity A ON I.id = A.Item_ID
WHERE
   A.timestamp BETWEEN @YourStartDate AND @YourEndDate;

答案 1 :(得分:0)

你找对那些在那一年有行动的物品是对的。这很简单:

select distinct item_id
from item_activity
where status in ('Checked In', 'Checked out')
and year(timestmp) = 2015;

因此,我们会错过那些在2015年之前签到但未经过检查的项目(即2015年之前的最后一次行动是办理登机手续)。

select item_id
from
(
  select item_id, status
  from item_activity
  where status in ('Checked In', 'Checked out')
  and year(timestmp) < 2015
  order by timestmp desc limit 1 -- latest record before 2015
) last_item_action
where status = 'Checked In'; -- latest action was check-in

两个查询合并:

select item_id
from item_activity
where status in ('Checked In', 'Checked out')
and year(timestmp) = 2015
union
select item_id
from
(
  select item_id, status
  from item_activity
  where status in ('Checked In', 'Checked out')
  and year(timestmp) < 2015
  order by timestmp desc limit 1
) last_item_action
where status = 'Checked In';

(在此合并查询中,您甚至可以将第一个查询限制为where status = 'Checked In',因为我们不再关注此处的结帐。这仅适用于我们现在发现的2015年之前检查的商品第二个问题。)