Access 2013:旋转多列
Access 2013: Pivot multiple columns
我有一个奇怪的访问数据库 table,在与 Tableau 一起使用之前我需要对其进行转换。我正在使用 Access 2013。数据完全是假的,但结构是正确的。
有 200 个文件,每个文件大约有 1500 次运行。我有 50 年的指标。每个 file/run 我有大约 10 个指标。
+--------------------------------------------------------+
| DataTable |
+-------------+--------------+------+------+------+------+
| FileIDRunID | Metric | 1999 | 2000 | 2001 | 2002 |
+-------------+--------------+------+------+------+------+
| 00000100001 | Breakfast | 45 | 47 | 48 | 49 |
| 00000100001 | Lunch | 27 | 37 | 50 | 99 |
| 00000100002 | Breakfast | 45 | 47 | 48 | 49 |
| 00000100002 | Lunch | 27 | 37 | 50 | 99 |
| 00000200001 | Breakfast | 45 | 47 | 48 | 49 |
| 00000200001 | Lunch | 27 | 37 | 50 | 99 |
| 00000200002 | Breakfast | 45 | 47 | 48 | 49 |
| 00000200002 | Lunch | 27 | 37 | 50 | 99 |
+-------------+--------------+------+------+------+------+
我想旋转并将指标作为列,将年份作为单独的行。
+------------------------------------------------+
| DataTableView |
+-------------+--------------+-----------+-------+
| FileIDRunID | Year | Breakfast | Lunch |
+-------------+--------------+-----------+-------+
| 00000100001 | 1999 | 45 | 47 |
| 00000100001 | 2000 | 27 | 37 |
| 00000100002 | 1999 | 45 | 47 |
| 00000100002 | 2000 | 27 | 37 |
| 00000200001 | 1999 | 45 | 47 |
| 00000200001 | 2000 | 27 | 37 |
| 00000200002 | 1999 | 45 | 47 |
| 00000200002 | 2000 | 27 | 37 |
+-------------+--------------+-----------+-------+
我成功度过了一年。
TRANSFORM FIRST(DataTable.[1999])
SELECT FileIDRunID, '1999' as Year
FROM DataTable
GROUP BY FileIDRunID
PIVOT DataTable.Metric
我认为下一步是手动将每年的所有内容联合起来。当我在明年尝试时,我得到了一个错误。
TRANSFORM FIRST(DataTable.[1999])
SELECT FileIDRunID, '1999' as Year
FROM DataTable
GROUP BY FileIDRunID
PIVOT DataTable.Metric
UNION ALL
TRANSFORM FIRST(DataTable.[2000])
SELECT FileIDRunID, '2000' as Year
FROM DataTable
GROUP BY FileIDRunID
PIVOT DataTable.Metric
查询表达式 'DataTable.Metric 中存在语法错误(缺少运算符)
联合所有
首先转换(DataTable.[2000])
SELECT FileID、RunID,年份为“2000”
从数据表
按 FileIDRunID 分组
枢轴 DataTable.Metric'
我希望这里有人有更好的主意:)。
我想我可能找到了 'an' 答案。仍然希望有更优雅的东西。
首先,将单独的列转换为单个列并进入名为 "DataTableFormatted"
的新视图
SELECT FileIDRunID, Metric, '1999' as Year
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, '2000' as Year
FROM DataTable
然后,对 table 执行转换。
TRANSFORM FIRST(DataValue)
SELECT FileIDRunID, Year
FROM DataTableFormatted
GROUP BY FileIDRunID, Year
PIVOT DataTableFormatted.Metric
TRANSFORM
可以 only occur at the start 一个 SQL 语句。
首先对所有年份进行反透视,然后才对度量进行透视。现在,作为 MS Access 显然
在涉及复杂查询(许多联合)时有其局限性,最好通过
中间 table:
SELECT FileIDRunID, Metric, Year, Value
FROM (
SELECT FileIDRunID, Metric, 1999 As Year, [1999] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2000 As Year, [2000] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2001 As Year, [2001] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2002 As Year, [2002] As Value
FROM DataTable
)
INTO myTempTable;
我已经 union
-ed 4 年了,但是您应该检查在 MS Access 拒绝过于复杂的声明之前您能走多远。
然后,再增加一些年份,union
s 的数量相同:
INSERT INTO myTempTable (FileIDRunID, Metric, Year, Value)
SELECT FileIDRunID, Metric, Year, Value
FROM (
SELECT FileIDRunID, Metric, 2003 As Year, [2003] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2004 As Year, [2004] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2005 As Year, [2005] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2006 As Year, [2006] As Value
FROM DataTable
);
等...最终做到这一点:
TRANSFORM FIRST(Value)
SELECT FileIDRunID,
Year
FROM myTempTable
GROUP BY FileIDRunID,
Year
PIVOT Metric
然后删除临时 table 并压缩数据库以恢复原始大小。如果可能,重新设计数据库以使用完全不可透视的结构,如临时 table.
我有一个奇怪的访问数据库 table,在与 Tableau 一起使用之前我需要对其进行转换。我正在使用 Access 2013。数据完全是假的,但结构是正确的。
有 200 个文件,每个文件大约有 1500 次运行。我有 50 年的指标。每个 file/run 我有大约 10 个指标。
+--------------------------------------------------------+
| DataTable |
+-------------+--------------+------+------+------+------+
| FileIDRunID | Metric | 1999 | 2000 | 2001 | 2002 |
+-------------+--------------+------+------+------+------+
| 00000100001 | Breakfast | 45 | 47 | 48 | 49 |
| 00000100001 | Lunch | 27 | 37 | 50 | 99 |
| 00000100002 | Breakfast | 45 | 47 | 48 | 49 |
| 00000100002 | Lunch | 27 | 37 | 50 | 99 |
| 00000200001 | Breakfast | 45 | 47 | 48 | 49 |
| 00000200001 | Lunch | 27 | 37 | 50 | 99 |
| 00000200002 | Breakfast | 45 | 47 | 48 | 49 |
| 00000200002 | Lunch | 27 | 37 | 50 | 99 |
+-------------+--------------+------+------+------+------+
我想旋转并将指标作为列,将年份作为单独的行。
+------------------------------------------------+
| DataTableView |
+-------------+--------------+-----------+-------+
| FileIDRunID | Year | Breakfast | Lunch |
+-------------+--------------+-----------+-------+
| 00000100001 | 1999 | 45 | 47 |
| 00000100001 | 2000 | 27 | 37 |
| 00000100002 | 1999 | 45 | 47 |
| 00000100002 | 2000 | 27 | 37 |
| 00000200001 | 1999 | 45 | 47 |
| 00000200001 | 2000 | 27 | 37 |
| 00000200002 | 1999 | 45 | 47 |
| 00000200002 | 2000 | 27 | 37 |
+-------------+--------------+-----------+-------+
我成功度过了一年。
TRANSFORM FIRST(DataTable.[1999])
SELECT FileIDRunID, '1999' as Year
FROM DataTable
GROUP BY FileIDRunID
PIVOT DataTable.Metric
我认为下一步是手动将每年的所有内容联合起来。当我在明年尝试时,我得到了一个错误。
TRANSFORM FIRST(DataTable.[1999])
SELECT FileIDRunID, '1999' as Year
FROM DataTable
GROUP BY FileIDRunID
PIVOT DataTable.Metric
UNION ALL
TRANSFORM FIRST(DataTable.[2000])
SELECT FileIDRunID, '2000' as Year
FROM DataTable
GROUP BY FileIDRunID
PIVOT DataTable.Metric
查询表达式 'DataTable.Metric 中存在语法错误(缺少运算符) 联合所有 首先转换(DataTable.[2000]) SELECT FileID、RunID,年份为“2000” 从数据表 按 FileIDRunID 分组 枢轴 DataTable.Metric'
我希望这里有人有更好的主意:)。
我想我可能找到了 'an' 答案。仍然希望有更优雅的东西。
首先,将单独的列转换为单个列并进入名为 "DataTableFormatted"
的新视图SELECT FileIDRunID, Metric, '1999' as Year
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, '2000' as Year
FROM DataTable
然后,对 table 执行转换。
TRANSFORM FIRST(DataValue)
SELECT FileIDRunID, Year
FROM DataTableFormatted
GROUP BY FileIDRunID, Year
PIVOT DataTableFormatted.Metric
TRANSFORM
可以 only occur at the start 一个 SQL 语句。
首先对所有年份进行反透视,然后才对度量进行透视。现在,作为 MS Access 显然 在涉及复杂查询(许多联合)时有其局限性,最好通过 中间 table:
SELECT FileIDRunID, Metric, Year, Value
FROM (
SELECT FileIDRunID, Metric, 1999 As Year, [1999] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2000 As Year, [2000] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2001 As Year, [2001] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2002 As Year, [2002] As Value
FROM DataTable
)
INTO myTempTable;
我已经 union
-ed 4 年了,但是您应该检查在 MS Access 拒绝过于复杂的声明之前您能走多远。
然后,再增加一些年份,union
s 的数量相同:
INSERT INTO myTempTable (FileIDRunID, Metric, Year, Value)
SELECT FileIDRunID, Metric, Year, Value
FROM (
SELECT FileIDRunID, Metric, 2003 As Year, [2003] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2004 As Year, [2004] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2005 As Year, [2005] As Value
FROM DataTable
UNION ALL
SELECT FileIDRunID, Metric, 2006 As Year, [2006] As Value
FROM DataTable
);
等...最终做到这一点:
TRANSFORM FIRST(Value)
SELECT FileIDRunID,
Year
FROM myTempTable
GROUP BY FileIDRunID,
Year
PIVOT Metric
然后删除临时 table 并压缩数据库以恢复原始大小。如果可能,重新设计数据库以使用完全不可透视的结构,如临时 table.