Access Union / Pivot交换列和行

时间:2013-01-04 20:46:42

标签: sql ms-access pivot transform union

在这里访问2010。我有一个问题(谢谢Andomar!):

SELECT Inspection.Date, count(*) AS [# Insp], sum(iif(Disposition = 'PASS',1,0)) AS [# Passed], sum(iif(Disposition = 'FAIL',1,0)) AS [# Failed], sum(iif(Disposition = 'PASS',1,0)) /  count(*) AS [% Acceptance]
FROM Inspection
WHERE Disposition in ('PASS', 'FAIL') AND ((Inspection.Date) Between Date() And Date()-30)
GROUP BY Date;

这给出了一个这样的表:

Date       | # Insp | # Passed | # Failed | % Acceptance
11/26/2012 | 7      | 5        | 2        | 71 
11/27/2012 | 8      | 4        | 4        | 50 
...

我希望使用此查询为图表下方的子表单创建“表格”,仅供参考。 “表”的格式很重要,因为它需要Column(Date)和Row标题。我在parentheis中有一个表来强调该表是实时生成的;换句话说,不存储为Access对象。

最终结果将是这样的:

Date         | 11/26/2012 | 11/27/2012 ...
# Insp       | 7          | 8
# Passed     | 5          | 4
# Failed     | 2          | 4
% Acceptance | 71         | 50

这似乎是一个最佳情况,因为轴只是翻转,但对于我的生活,我找不到不破坏数据的解决方案。交叉表查询仅允许我针对单个值过滤一个或多个类别。这是联盟将用于什么的东西;还是一个支点?是否需要改造?看起来它应该是一个如此简单的问题。这可以在SQL中完成,还是需要VBA来安排“表”?谢谢你的帮助!

这些链接确实适用:

Columns to Rows in MS Access

how to pivot rows to columns

1 个答案:

答案 0 :(得分:0)

这必须是一个两步变换过程。首先,您必须将当前查询中的数据旋转为行而不是列,然后您必须将日期转换为列而不是行。

查询将是这样的:

TRANSFORM max(val) as MaxValue
SELECT col
FROM
(
  SELECT [Date], '# Insp' as Col, [# Insp] as  val 
  FROM yourQuery
  UNION ALL
  SELECT [Date], '# Passed' as Col, [# Passed] as val
  FROM yourQuery
  UNION ALL
  SELECT [Date], '# Failed' as Col, [# Failed] as val
  FROM yourQuery
  UNION ALL
  SELECT [Date], '% Acceptance' as Col, [% Acceptance] as val
  FROM yourQuery
) 
GROUP BY col
PIVOT [Date]

我猜您当前的查询已保存在您的数据库中,您将我的示例中的yourQuery替换为您的查询名称。

我刚刚在MS Access 2003中使用上面示例中的值对其进行了测试,并生成了您想要的结果。