2012-07-25 99 views
0

我有一个跟踪库存位置的数据库。带有日期计算的SQL视图

该应用程序写得很差,并且是没有MVC分离的意大利面条代码的混乱,并且可以在任何数量的文件中更新模型。

首次编写应用程序时,只需跟踪库存当前所在的位置,因此库存表中存在一个列出当前分配给的SiteID列。

从那时起,业主已决定他想保留库存分配到哪些位置的历史记录。不是遍历所有的代码来试图找到它可能更新的所有地方,而是将一个触发器ON UPDATEON INSERT添加到记录历史表中移动的库存表中。

最初的要求是能够查看部分广告这是很容易与SELECT * FROM history WHERE InvID = X ORDER BY timestamp DESC

现在,我一直在问什么时候一块产生列表给定位置的显示解决了运动历史的库存被分配给该网站,并且它离开的日期(下面的例子)。理想情况下,如果可能的话,我希望在不修改现有模式和触发器的情况下实现此目的。

我可以检索在某一点分配给该网站的所有清单及其分配日期的清单。我正在努力的是如何找到该部分库存离开该网站的日期。我可以在应用程序中做到这一点,但我想知道是否可以使用SQL。

库存表

InventoryID  InventoryName SiteID 
===========  ============= ====== 
      1  Widget A   $ID 
      2  Widget B   $ID 
      3  Widget C   $ID 

位置表

SiteID SiteName 
====== ======== 
    1 Somewhere 
    2 Nowhere 
    3 Anywhere 

历史表

InvID SiteID Timestamp 
===== ====== ========= 
    1   1 2012-01-01 
    1   2 2012-01-02 
    2   1 2012-01-03 
    1   1 2012-01-04 

新的观点应该是这个样子

InvID DateIn  DateOut 
===== ========== ========== 
    1 2012-01-01 2012-01-02 
    2 2012-01-03 NULL 
    1 2012-01-04 NULL 

的伪代码,以产生与编程语言表(后处理SQL查询

SELECT * FROM history WHERE SiteID = 1 

foreach (row in result) { 
    DateOut = SELECT * FROM history WHERE InvID = result.InvID AND timestamp > result.timestamp LIMIT 1 
} 

回答

1

试试这个:

它只是可能左外连接到同一个表并从右表中取最短日期

select H1.InvID,I.InventoryName,H1.SiteID,H1.[Timestamp] [date in], 
MIN(H2.[Timestamp]) [date out] 
from History H1 left outer join History H2 
on  H1.InvID=H2.InvID and H1.[Timestamp]<H2.[Timestamp] 
join Inventory I on I.InventoryID= H1.InvID 
where H1.SiteID=1 
group by H1.InvID,I.InventoryName,H1.SiteID,H1.[Timestamp] 

Sql Fiddle demo

+0

工作就像一个魅力!谢谢:) – mcourtney 2012-07-25 07:20:53

+0

是否有可能扩大这个在结果中包括库存名称? InvID InvName DateIn DateOut ======= ========== ========== 1 Widget A 2012-01-01 2012- 01-02 2小工具B 2012-01-03 NULL 1小工具A 2012-01-04 NULL – mcourtney 2012-07-25 07:29:37

+1

@mcourtney:非常有可能。我更新了我的查询。请检查它 – 2012-07-25 07:38:19

0

你可以使用子查询找到的第一天,其中库存产品在不同的网站:

select h1.InvID 
,  h1.Timestamp as DateIn 
,  (
     select min(TimeStamp) 
     from history h2 
     where h2.InvID = h1.InvID 
       and h2.SiteID <> h1.SiteID 
       and h2.TimeStamp > h1.TimeStamp 
     ) as DateOut 
from history h1 
where h1.SiteID = X 
+0

这似乎有一个错误。对于只有一个历史记录(即初始分配)的清单,仍然会列出DateOut(预期结果为NULL) – mcourtney 2012-07-25 07:16:16