如何在Access 2013中创建多值CrossTab查询?

时间:2016-01-12 19:25:15

标签: ms-access join pivot union crosstab

我的问题

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

如果有人正在使用类似问题在线搜索,则会出现参考目的 - 如果您尝试添加多个' Value' Access中的字段:

  

要创建交叉表查询,您必须指定一个或多个Row   标题选项,一个列标题选项和一个值选项

疑难解答

我已经阅读了很多关于如何执行此操作的文章,包括UNIONsJOINsconditional aggregates - 但没有一篇有效。

此时我有两个FUNCTIONAL交叉表查询...一个按日期,按状态返回COUNT的查询;和按状态返回SUM的日期。我还没有找到一种方法将计数和总和合并到一个表中。此时我不在乎是否通过查询或报告完成 - 但我认为查询是最简单的方法。

我有更多的地位'比下面显示的那些,但是对于我的数据的想法,这里是条件聚合解决方案的剪辑:

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")

我的目标

获取单个结果表。第1列=服务月份(该月内所有原始记录合计)。第2列=按月计算的总记录数。第3列=按月计算[Amt Total]字段的总和。最后(Crosstab枢轴功能进入的地方),列4-x =按状态显示[状态X,状态Y ...和状态Z]的记录数;和列x-y =按[月份] [状态X,状态Y ...和状态Z]的记录总和。

非常感谢在单个查询表中获取SUM和COUNT个透视值的任何帮助!

示例数据

CrossTab"金额"查询结果

Month of Service Gross Charges  DENIED     OPEN       PAID
2011-12          $1,613.20                 $1,613.20            
2012-02          $999.00          $999.00
2012-05          $14,296.00           $14,296.00        
2014-09          $37,776.00 $2,874.00   $8,925.50   $25,976.50  

CrossTab"数量"查询结果

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        

我的目标是简单地合并两个表格......保持'服务月份'作为最左边的列,然后只有"数量","拒绝数量","打开数量"和"支付数量"带有" Gross Charges"," Denied Amt"," Open Amt"," Paid Amt"列全部基于服务月。

我的SQL

CrossTab" 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;

CrossTab"数量"查询

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;

2 个答案:

答案 0 :(得分:2)

答案是使用内连接(类似于我在其他地方读过的内容)。但是,对于那些不了解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];

答案 1 :(得分:0)

由于交叉表查询单独工作,因此只需将它们组合在最后的选择中即可。根据您的数据,您可能会遇到交叉表中有时缺少列的问题,因此很难在其上编写选择。一个简单的答案是使用union将一些存根行合并到为交叉表提供的数据中,以确保它们始终具有所有列。