我正在寻找一个查询,它将:读取一列中一行的当前值,将其与上面的行进行比较,如果上面的行匹配,则按顺序向上计数。从本质上讲,这听起来像是一个运行计数而不是 Count(*),几乎就像行应该在每组行上变为 Count(Variable)-1,直到它达到最小值为零。下面的示例假设我们有一个每日销售额列表并计算给定产品 ID 的出现次数。这可能吗?
选择 Count(ProductID) AS SalesCount 未知公式作为 SalesOccurence
您所描述的内容有时可以在 Access 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