如何在 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];
我的问题
我在 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
此时我有两个 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];