2013-10-20 27 views
2

我正在尋找一個查詢,它將:讀取一列中一行的當前值,將它與上面的行進行比較,並在上面的行匹配時按順序計數。從本質上講,這聽起來像是一個正在運行的計數器,而不是一個Count(*),就像行應該在每一行上計數(變量)-1直到它達到最小值零一樣。以下示例假設我們有一個每日銷售清單並計算給定產品ID的出現次數。這可能嗎?MS Access - 對於給定變量的每次出現,增加一個「count」值?

SELECT COUNT(產品ID)AS SalesCount 未知公式SalesOccurence

+6

對於這個問題'擱置'的人 - 我很努力地看到這個問題是如何特別糟糕的,事實上,與本網站上的許多Access問題相比,這非常好。而且,它在幾個小時之前得到了一個合理的答案,然後你們認爲它不夠好,無法得到答案! WTF? –

回答

4

你描述有時可以訪問SQL使用自聯接包括完成一個大於或低於一個關係的領域。例如,假設我們有一個名爲[SalesHistory數據]與數據

ProductID SalesDate DailySales 
--------- ---------- ---------- 
001  2013-10-16   225 
001  2013-10-17   195 
001  2013-10-18   250 
002  2013-10-16   350 
002  2013-10-17   375 
002  2013-10-18   330 

查詢結果如下

SELECT t1.ProductID, t1.SalesDate, t2.ProductID, t2.SalesDate 
FROM 
    SalesHistory t1 
    INNER JOIN 
    SalesHistory t2 
     ON t1.ProductID = t2.ProductID 
      AND t1.SalesDate >= t2.SalesDate 
ORDER BY t1.ProductID, t1.SalesDate 

回報

t1.ProductID t1.SalesDate t2.ProductID t2.SalesDate 
------------ ------------ ------------ ------------ 
001   2013-10-16 001   2013-10-16 
001   2013-10-17 001   2013-10-17 
001   2013-10-17 001   2013-10-16 
001   2013-10-18 001   2013-10-18 
001   2013-10-18 001   2013-10-17 
001   2013-10-18 001   2013-10-16 
002   2013-10-16 002   2013-10-16 
002   2013-10-17 002   2013-10-17 
002   2013-10-17 002   2013-10-16 
002   2013-10-18 002   2013-10-18 
002   2013-10-18 002   2013-10-17 
002   2013-10-18 002   2013-10-16 

注意,對於t1.ProductID='001'有一排表返回爲t1.SalesDate=#2013-10-16#,兩行爲t1.SalesDate=#2013-10-17#,依此類推。所以,我們就可以調整該查詢計數返回的行,這將讓我們每個日期的排名,按ProductID

SELECT t1.ProductID, t1.SalesDate, COUNT(*) AS DateRank 
FROM 
    SalesHistory t1 
    INNER JOIN 
    SalesHistory t2 
     ON t1.ProductID = t2.ProductID 
      AND t1.SalesDate >= t2.SalesDate 
GROUP BY t1.ProductID, t1.SalesDate 

...返回:

ProductID SalesDate DateRank 
--------- ---------- -------- 
001  2013-10-16   1 
001  2013-10-17   2 
001  2013-10-18   3 
002  2013-10-16   1 
002  2013-10-17   2 
002  2013-10-18   3 

如果我們保存了該查詢在Access中爲[SalesDateRanksByProduct]那麼我們就可以用它在另一個查詢,以顯示DateRank「計數器」旁邊的原始數據:

SELECT 
    SalesHistory.ProductID, 
    SalesHistory.SalesDate, 
    SalesHistory.DailySales, 
    SalesDateRanksByProduct.DateRank 
FROM 
    SalesHistory 
    INNER JOIN 
    SalesDateRanksByProduct 
     ON (SalesHistory.SalesDate = SalesDateRanksByProduct.SalesDate) 
      AND (SalesHistory.ProductID = SalesDateRanksByProduct.ProductID) 
ORDER BY SalesHistory.ProductID, SalesHistory.SalesDate; 

...返回:

ProductID SalesDate DailySales DateRank 
--------- ---------- ---------- -------- 
001  2013-10-16   225   1 
001  2013-10-17   195   2 
001  2013-10-18   250   3 
002  2013-10-16   350   1 
002  2013-10-17   375   2 
002  2013-10-18   330   3 
+0

不幸的是我的表格無法在日期的基礎上進行比較。例如,我的表只會有一個OrderNo實例,而不是多個實例中的多個實例。在比較兩個純文本字段時是否可以進行內連接? – user2891306

+0

@ user2891306你沒有給我們足夠詳細的數據說明,但一般來說,是的,可以使用文本字段來代替我在示例中使用的日期字段。 (也就是說,沒有理由爲什麼用於'> ='連接條件*的字段必須是日期字段。) –