如何在 Access 2013 中创建多值交叉表查询?

How can I Create a Multi-Value CrossTab Query in Access 2013?

我的问题

我在 Access 2013 中工作。我有一组数据需要根据两个字段进行细分(最好使用交叉表查询来完成)。我的问题是,我需要显示每个 'Value'([Amt Total] 字段)的 SUM 和 COUNT——不幸的是,Access 尚未允许多值交叉表查询。

供参考,如果有人在网上搜索有类似问题 - 如果您尝试在 Access 中添加多个 'Value' 字段会导致错误:

To create a crosstab query, you must specify one or more Row Heading(s) options, one Column Heading option, and one Value option

疑难解答

我已经阅读了很多关于如何做到这一点的文章,包括 UNIONs, JOINs, and -- 但 none 已经奏效了。

此时我有两个 FUNCTIONAL 交叉表查询...一个 returns COUNT,按日期,按状态;还有一个 returns SUM,按日期,按状态。我还没有找到一种方法将计数和总和组合成一个 table。在这一点上,我不关心它是通过查询还是通过报告完成的 - 但我认为查询是最简单的方法。

我的状态比下面显示的要多很多,但为了了解我的数据,这里是条件聚合解决方案的片段:

SELECT Format([DOS],"yyyy-mm") AS [Month of Service],
       Count(IIF(myStatus='OPEN', myStatus, Null)) As [Open Accts],
       Sum(IIF(myStatus='OPEN', [Amt Total], Null)) As [Open Amt], 
       Count(IIF(myStatus='PAID', myStatus, Null)) As [Paid Accts],
       Sum(IIF(myStatus='PAID', [Amt Total], Null)) As [Paid Amt]
FROM [myTable]
GROUP BY Format([DOS],"yyyy-mm")

我的目标

获得单个结果table。第 1 列 = 服务月份(该月内的所有原始记录合并)。第 2 列 = 总记录数,按月。第 3 列 = [Amt Total] 字段的 TOTAL 总和,按月。最后(交叉表数据透视功能出现的地方),第 4-x 列 = [状态 X、状态 Y... 和状态 Z] 的记录计数,按月;和列 x-y = [状态 X、状态 Y... 和状态 Z] 的记录总和,按月。

任何帮助在单个查询中获取 SUM 和 COUNT 枢轴值的人都将不胜感激 table!

示例数据

交叉表"Amount"查询结果

Month of Service Gross Charges  DENIED     OPEN       PAID
2011-12          ,613.20                 ,613.20            
2012-02          9.00          9.00
2012-05          ,296.00           ,296.00        
2014-09          ,776.00 ,874.00   ,925.50   ,976.50  

交叉表"Quantity"查询结果

Month of Service    Quantity    DENIED  OPEN    PAID
2011-12                 1                 1         
2012-02                 1          1
2012-05                 1                 1 
2014-09                21          1      2       18        

我的目标是简单地合并两个 table...保持 'Month of Service' 作为最左边的列,然后只有 "Quantity"、"Denied Qty" 、"Open Qty" 和 "Paid Qty" 列以及 "Gross Charges"、"Denied Amt"、"Open Amt"、"Paid Amt" 列均基于服务月份。

我的SQL

交叉表"Amt"查询

TRANSFORM Sum([myTable].[Total]) AS [SumOfTotal]
SELECT Format([DOS],"yyyy-mm") AS [Month of Service], Sum([myTable].[Total]) AS [Gross Charges]
FROM [myTable]
GROUP BY Format([DOS],"yyyy-mm")
PIVOT [myTable].myStatus;

交叉表"Qty"查询

TRANSFORM Count([myTable].[Total]) AS [CountOfTotal]
SELECT Format([DOS],"yyyy-mm") AS [Month of Service], Count([myTable].[Total]) AS [Quantity]
FROM [myTable]
GROUP BY Format([DOS],"yyyy-mm")
PIVOT [myTable].myStatus;

由于您有单独工作的交叉表查询,所以只需在末尾将它们组合在 select 中。根据您的数据,您可能会遇到问题,交叉表中的列有时会丢失,因此很难在它们上面写 select。一个简单的答案是使用 union 将一些存根行合并到提供交叉表的数据中,以确保它们始终包含所有列。

答案是使用内部联接(类似于我在其他地方读到的内容)。但是,对于那些不了解 SQL 或无法理解的人——我从头开始编写了自己的 SQL 查询,该查询有效。

这里有一个通用查询,供遇到类似问题的所有人使用。只需复制下面的代码,替换以下变量...您应该可以从那里扩展!

变量

[myCrossTabQueryCOUNT] = name of your COUNT crosstab query

[myCrossTabQuerySUM] = name of your SUM crosstab query

[Month of Service] = field name that is the primary ROW HEADING for each crosstab query

[mySum] = field name of your 'Value' field in the [myCrossTabQuerySUM] query (in my example it held a Sum value)

[myCount] = field name of your 'Value' field in the [myCrossTabQueryCOUNT] query (in my example it held a Count value) 

SQL 查看查询

SELECT [myCrossTabQueryCOUNT].[Month of Service], [myCrossTabQueryCOUNT].[myCount] AS [Count], [myCrossTabQuerySUM].[mySum] AS [Total Claim Charges]
FROM (([myCrossTabQueryCOUNT] 
INNER JOIN [myCrossTabQuerySUM] 
ON [myCrossTabQueryCOUNT].[Month of Service]=[myCrossTabQuerySUM].[Month of Service])
ORDER BY [myCrossTabQueryCOUNT].[Month of Service];