2014-03-05 170 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