我正在尋找一個查詢,它將:讀取一列中一行的當前值,將它與上面的行進行比較,並在上面的行匹配時按順序計數。從本質上講,這聽起來像是一個正在運行的計數器,而不是一個Count(*),就像行應該在每一行上計數(變量)-1直到它達到最小值零一樣。以下示例假設我們有一個每日銷售清單並計算給定產品ID的出現次數。這可能嗎?MS Access - 對於給定變量的每次出現,增加一個「count」值?
SELECT COUNT(產品ID)AS SalesCount 未知公式SalesOccurence
我正在尋找一個查詢,它將:讀取一列中一行的當前值,將它與上面的行進行比較,並在上面的行匹配時按順序計數。從本質上講,這聽起來像是一個正在運行的計數器,而不是一個Count(*),就像行應該在每一行上計數(變量)-1直到它達到最小值零一樣。以下示例假設我們有一個每日銷售清單並計算給定產品ID的出現次數。這可能嗎?MS Access - 對於給定變量的每次出現,增加一個「count」值?
SELECT COUNT(產品ID)AS SalesCount 未知公式SalesOccurence
你描述有時可以訪問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
不幸的是我的表格無法在日期的基礎上進行比較。例如,我的表只會有一個OrderNo實例,而不是多個實例中的多個實例。在比較兩個純文本字段時是否可以進行內連接? – user2891306
@ user2891306你沒有給我們足夠詳細的數據說明,但一般來說,是的,可以使用文本字段來代替我在示例中使用的日期字段。 (也就是說,沒有理由爲什麼用於'> ='連接條件*的字段必須是日期字段。) –
對於這個問題'擱置'的人 - 我很努力地看到這個問題是如何特別糟糕的,事實上,與本網站上的許多Access問題相比,這非常好。而且,它在幾個小時之前得到了一個合理的答案,然後你們認爲它不夠好,無法得到答案! WTF? –