MS ACCESS SQL QUERY COUNT DISTINCT

Posted

技术标签:

【中文标题】MS ACCESS SQL QUERY COUNT DISTINCT【英文标题】: 【发布时间】:2014-01-17 21:12:11 【问题描述】:

我明白如何在像这样简单的情况下进行计数:

SELECT AllItemsDateRange.Processors.ACH_Processor, COUNT(*) AS NumDays
FROM (SELECT DISTINCT AllItemsDateRange.Processors.ACH_Processor, AllItemsDateRange.SubmitDate FROM AllItemsDateRange)  AS T1
GROUP BY AllItemsDateRange.Processors.ACH_Processor;

但是,当它是一个更复杂的查询时,我不确定如何在不影响其他数据的情况下添加不同的计数。在下面的查询中,我希望最后一项 (NumDays) 是 AllItemsDateRange.Processors.ACH_Processor、AllItemsDateRange.SubmitDate 的不同计数。

SELECT AllItemsDateRange.Processors.ACH_Processor, AllItemsDateRange.ExposureLimit, AllItemsDateRange.Footprint, Sum(IIf([AllItemsDateRange].[DebitAmount]>0,1,0)) AS Debits, Sum(AllItemsDateRange.DebitAmount) AS DebitAmt, Sum(IIf([AllItemsDateRange].[CreditAmount]>0,1,0)) AS Credits, Sum(AllItemsDateRange.CreditAmount) AS CreditAmt, Sum(IIf(([AllItemsDateRange].[ReturnDate]>0) And ([AllItemsDateRange].[DebitAmount]>0),1,0)) AS DebitReturns, Sum(IIf(([AllItemsDateRange].[ReturnDate]>0) And ([AllItemsDateRange].[CreditAmount]>0),1,0)) AS CreditReturns, Sum(IIf([AllItemsDateRange].[ReturnDate]>0,[AllItemsDateRange].[CreditAmount]+[AllItemsDateRange].[DebitAmount],0)) AS ReturnAmt, Sum(IIf((([AllItemsDateRange].[ReturnCode]="R05") Or ([AllItemsDateRange].[ReturnCode]="R07") Or ([AllItemsDateRange].[ReturnCode]="R10") Or ([AllItemsDateRange].[ReturnCode]="R29") Or ([AllItemsDateRange].[ReturnCode]="R51")) And ([AllItemsDateRange].[DebitAmount]>0),1,0)) AS UnauthorizedReturns, Sum(IIf((([AllItemsDateRange].[ReturnCode]="R05") Or ([AllItemsDateRange].[ReturnCode]="R07") Or ([AllItemsDateRange].[ReturnCode]="R10") Or ([AllItemsDateRange].[ReturnCode]="R29") Or ([AllItemsDateRange].[ReturnCode]="R51")) And ([AllItemsDateRange].[DebitAmount]>0),[DebitAmount],0)) AS UnauthorizedReturnAmt, COUNT(AllItemsDateRange.SubmitDate) AS NumDays
    FROM AllItemsDateRange
    GROUP BY AllItemsDateRange.Processors.ACH_Processor, AllItemsDateRange.ExposureLimit, AllItemsDateRange.Footprint
    ORDER BY AllItemsDateRange.Footprint, AllItemsDateRange.ExposureLimit DESC , AllItemsDateRange.Processors.ACH_Processor DESC;

编辑: [AllItemsDateRange] 基本上是一个交易列表。每笔交易都有一个日期。我想通过 ACH_Processor 汇总数据。因此,获得计数和借方和贷方总和的摘要很容易。困难的部分是计算 ACH_Processor 处理交易的不同天数,以便我以后可以计算每日平均值。

【问题讨论】:

您希望在第二个查询中获得不同的计数,只需将 ACH_Processor 计数(*)作为天数? ***.com/questions/11880199/… 我基本上希望第一个查询包含在第二个查询结果中(代替 NumDays)。这有意义吗? 【参考方案1】:

修改第一个查询以生成与第二个查询相同的 GROUP BY 的不同计数 (NumDays)。

从第二个查询中删除NumDays

那么你就可以INNER JOIN这两个在GROUP BY中包含的那些字段了。

但是再次阅读这个问题,听起来您确实希望每个查询都使用不同的GROUP BY。在这种情况下,连接基于包含在两者中的字段:ACH_Processor

这仍然可以工作,但相同的NumDays 值可能会在最终查询的多行中重复。但也许这就是你想要的......

【讨论】:

我认为您正在做某事。我不确定我是否完全理解如何实现这一点。我的问题可能是 AllItemsDateRange 已经是一个连接多个表的查询。因此,基于查询编写查询可能会使事情变得过于复杂。我可能需要退后一步重新考虑表格结构。基本上,我正在尝试编写此查询,因为我正在使用报表将所有这些数据使用 DLOOKUP 用于某些字段(例如 - NumDays)并且生成时间太长。此查询将在几秒钟后出现。 我采纳了您的建议,即使第一个查询在结构上尽可能接近第二个查询,然后使用 INNER JOIN。它似乎奏效了。感谢您的帮助!【参考方案2】:

count(Distinct fieldname) 访问中不支持功能:您必须这样做才能获得不同:How do I count unique items in field in Access query?

【讨论】:

我知道如何获得不同的计数。我只是无法将该计数包含在另一个更复杂的查询中。不过谢谢。

以上是关于MS ACCESS SQL QUERY COUNT DISTINCT的主要内容,如果未能解决你的问题,请参考以下文章

SELECT Count Distinct Syntax MS Access SQL [重复]

MS-Access 中的 SQL:使用 COUNT、JOIN 并返回 0

SQL INSERT INTO SUBFORM from QUERY in ms access

MS Access Query 计算季度增长率的 SQL 语句

使用 MS Access Query 反透视或转换数据

带有日期分隔符的 C# 和 MS Access SQL