2013-10-20 26 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你没有给我们足够详细的数据说明,但一般来说,是的,可以使用文本字段来代替我在示例中使用的日期字段。 (也就是说,没有理由为什么用于'> ='连接条件*的字段必须是日期字段。) –