【问题标题】:MS Access - For each occurence of a given variable, increase a "count" value by one?MS Access - 对于给定变量的每次出现,将“计数”值增加一?
【发布时间】:2013-10-28 16:10:31
【问题描述】:

我正在寻找一个查询,它将:读取一列中一行的当前值,将其与上面的行进行比较,如果上面的行匹配,则按顺序向上计数。从本质上讲,这听起来像是一个运行计数而不是 Count(*),几乎就像行应该在每组行上变为 Count(Variable)-1,直到它达到最小值为零。下面的示例假设我们有一个每日销售额列表并计算给定产品 ID 的出现次数。这可能吗?

选择 Count(ProductID) AS SalesCount SalesOccurence 的未知公式

【问题讨论】:

  • 致那些把这个问题“搁置”的人——我很难看出这个问题是如何特别糟糕的,事实上,与这个网站上的许多 Access 问题相比,它非常好。此外,在您认为它还不足以收到答案之前的几个小时,它就收到了一个合理的答案!什么鬼?

标签: sql ms-access count


【解决方案1】:

您所描述的内容有时可以在 Access SQL 中使用 self-join 来完成,其中包含一个字段之间的大于或小于关系。例如,假设我们有一个名为 [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 您没有向我们提供有关您的数据的足够详细信息,无法确定,但一般来说,是的,可以使用文本字段代替我在示例中使用的日期字段. (也就是说,用于>= 连接条件的字段没有理由必须 是日期字段。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2014-07-23
  • 2012-05-31
  • 1970-01-01
  • 2015-09-04
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多