我有一个旧版 MS Access 2007 表,其中包含 52 个字段(一年中的每周 1 个字段)代表历史销售数据(实际上加上一个字段)。我想将此数据库转换为更传统的时间/值列表。
有谁知道如何在不使用 52+ 显式参数编写查询的情况下做到这一点?
(如果MS SQL Server 2005下存在解决方案,我也可以导出/导入表)
我有一个旧版 MS Access 2007 表,其中包含 52 个字段(一年中的每周 1 个字段)代表历史销售数据(实际上加上一个字段)。我想将此数据库转换为更传统的时间/值列表。
有谁知道如何在不使用 52+ 显式参数编写查询的情况下做到这一点?
(如果MS SQL Server 2005下存在解决方案,我也可以导出/导入表)
UNPIVOT
PIVOT
通过将列旋转为行来执行 的几乎相反的操作. 假设上一个示例中生成的表在数据库中存储为pvt
,并且您希望将列标识符Emp1
、Emp2
、Emp3
、Emp4
和轮换为Emp5
与特定供应商对应的行值。这意味着您必须确定另外两个列。将包含您正在旋转的列值 (Emp1
,Emp2
,...)Employee
的列将被称为 ,而将保存当前位于正在旋转的列下的值的列将被称为 Orders。这些列对应于pivot_column和 value_column,分别在 Transact-SQL 定义中。这是查询。
--Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int)
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4)
INSERT INTO pvt VALUES (2,4,1,5,5,5)
INSERT INTO pvt VALUES (3,4,3,5,4,4)
INSERT INTO pvt VALUES (4,4,2,5,5,4)
INSERT INTO pvt VALUES (5,5,1,5,5,5)
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt
GO
这是部分结果集。
VendorID Employee Orders
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5
...
如上所述,UNPIVOT 运算符(如果可用)将执行此操作...如果此操作不可用,则 std SQL 方法是:
联合多个选择语句(每周一个),使用相同的列名别名为特定周的列别名
Select 1 as week, Week1Val as value from Table
UNION
Select 2 as week, Week2Val as value from Table
UNION
Select 3 as week, Week3Val as value from Table
UNION
...
UNION
Select 52 as week, Week52Val as value from Table
无需导出到 SQL Server。在 Access 中,尝试 /View/PivotTable View 子菜单。(无论如何,它在我的 Access 2003 中。)我比 Excel 中的更喜欢它。