我有一个旧版MS Access 2007表,其中包含52个字段(一年中的每个星期1个字段),代表历史销售数据(实际上是一年中的一个字段)。我想将此数据库转换为更常规的时间/值列表。
有谁知道如何在不编写具有52个以上显式参数的查询的情况下做到这一点?
(如果MS SQL Server 2005下存在解决方案,我也可以导出/导入表)
使用PIVOT和UNPIVOT。
UNPIVOT``PIVOT通过将列旋转为行来执行与几乎相反的操作。假设前面的例子中产生的表存储在数据库中pvt,你要旋转的列标识符 Emp1,Emp2,Emp3,Emp4,和Emp5成排的值对应于特定供应商。这意味着您必须标识另外两个列。将包含将要旋转的列值(Emp1,Emp2…)Employee的列称为 ,将保存当前位于要旋转的列下的值的列称为订单。这些列对应于 pivot_column 和 value_column 分别在Transact- SQL定义中。这是查询。
UNPIVOT``PIVOT
pvt
Emp1
Emp2
Emp3
Emp4
Emp5
Employee
--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 ...