我正在寻找一个查询,它将:读取一列中一行的当前值,将它与上面的行进行比较,并在上面的行匹配时按顺序计数。从本质上讲,这听起来像是一个正在运行的计数器,而不是一个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? –