我有一个遗留的MS Access 2007表格,其中包含52个字段(每年52周)代表历史销售数据(实际上还有一个字段代表年份)。我想将这个数据库转换为更常规的时间/值列表。
有没有人知道如何在不编写52个以上显式参数的查询的情况下完成这项工作?
(如果在MS SQL Server 2005下存在解决方案,我也可以导出/导入该表格)
我有一个遗留的MS Access 2007表格,其中包含52个字段(每年52周)代表历史销售数据(实际上还有一个字段代表年份)。我想将这个数据库转换为更常规的时间/值列表。
有没有人知道如何在不编写52个以上显式参数的查询的情况下完成这项工作?
(如果在MS SQL Server 2005下存在解决方案,我也可以导出/导入该表格)
如上所述,如果有UNPIVOT运算符,它将执行此操作...如果没有,则标准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
UNPIVOT
几乎是PIVOT
的反向操作,通过将列旋转为行。假设前一个示例中生成的表作为pvt
存储在数据库中,并且您想要将列标识符Emp1
,Emp2
,Emp3
,Emp4
和Emp5
旋转成对应于特定供应商的行值。这意味着您必须标识出两个附加列。将包含正在旋转的列值(Emp1
,Emp2
等)的列称为Employee
,将保存当前位于旋转列下的值的列称为Orders
。这些列分别对应于 Transact-SQL 定义中的 pivot_column 和 value_column。以下是查询。
--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
...
无需导出到 SQL Server。在 Access 中,尝试使用 /View/PivotTable 视图子菜单。(至少在我的 Access 2003 中是这样的。)我比 Excel 中的更喜欢它。