2014-03-05 111 views
0

我们有一个表来跟踪项目在仓库:遍历日期

------------------------- 
ID  DATEIN  DATEOUT 
------------------------- 

我们需要的是在每周的仓库物品的量的列表。

这是多远,我们已经得到了:

SELECT 
    COUNT (ID) 
FROM 
    table 
WHERE 
    table.DATEIN<=#somedate1# 
    AND 
    (
     table.DATEOUT>#somedate1# 
     OR 
     table.DATEOUT IS NULL 
    ) 

这使我们的项目在日期#somedate1#仓库中的数量。但是,我们需要每周的金额清单。 (请注意,有些物品可能会留在仓库中数月)

棘手的部分不是一周,我们可以使用DATEPART(“ww”,#somedate1#),但循环遍历日期。

任何想法?

回答

1

你试过了吗?

 SELECT 
      DATEPART("ww","D"),COUNT (ID) 
     FROM 
      (
      SELECT Table.DATEIN as D 
      FROM table 
      WHERE table.DATEIN<=#somedate1# AND (table.DATEOUT>#somedate1# OR table.DATEOUT IS NULL) 
      UNION ALL 
      SELECT Table.DATEOUT as D 
      FROM table 
      WHERE table.DATEIN<=#somedate1# AND (table.DATEOUT>#somedate1# OR table.DATEOUT IS NULL) 
      ) 
     GROUP BY DATEPART("ww","D") 

首先,你需要做一个UNION,以确保您拥有所有DATEINDATEOUT,那么你就可以GROUP BY

+0

不幸的是,这不是我们所需要的。它会添加我们指定日期的星期编号,但它仍然会提供我们指定的星期内的项目数量。 – user1833551

+0

暂时忘记一周的数字,那一部分并不重要。如果我们每天可以得到相同的结果,而不是每周,我们也会得到我们所需要的。问题在于我们无法遍历日期。 – user1833551

0

以下是我们想出这么远。

此代码给出了物品进入仓库或留下的所有日期的列表。这些是我们需要在我的第一篇文章中应用代码的日期。即我们通过这些日期,其中对于每个迭代的下一个日期作为#somedate1#

SELECT 
    table.DATEIN AS DATE 
FROM 
    table 
GROUP BY 
    table.DATEIN 
UNION 
SELECT 
    table.DATEOUT AS DATE 
FROM 
    table 
WHERE 
    table.DATEOUT NOT IN (
     SELECT 
      table.DATEIN 
     FROM 
      table 
     GROUP BY 
      table.DATEIN 
    ) 
GROUP BY 
    table.DATEOUT 

我们坚持我们如何能够循环通过他们虽然需要循环。我们尝试的一切都会带来我们并不期待的奇怪结果。

0

我们明白了!答案始终在我们面前凝视着我们。这是诀窍:

SELECT 
    COUNT (table1.ID), 
    table2.DATE 
FROM 
    table1, 
    (
     SELECT 
      table1.DATEIN AS DATE 
     FROM 
      table1 
     GROUP BY 
      table1.DATEIN 
     UNION 
     SELECT 
      table1.DATEOUT AS DATE 
     FROM 
      table1 
     WHERE 
      table1.DATEOUT NOT IN (
       SELECT 
        table1.DATEIN 
       FROM 
        table1 
       GROUP BY 
        table1.DATEIN 
      ) 
     GROUP BY 
      table1.DATEOUT 
    ) table2 
WHERE 
    table1.DATEIN<=table2.DATE 
    AND 
    (
     table1.DATEOUT>table2.DATE 
     OR 
     table1.DATEOUT IS NULL 
    ) 
GROUP BY 
    table2.DATE