如何通过SQL在MS Access 2007或MS SQL Server 2005中将字段转换为行

3

我有一个遗留的MS Access 2007表格,其中包含52个字段(每年52周)代表历史销售数据(实际上还有一个字段代表年份)。我想将这个数据库转换为更常规的时间/值列表。

有没有人知道如何在不编写52个以上显式参数的查询的情况下完成这项工作?

(如果在MS SQL Server 2005下存在解决方案,我也可以导出/导入该表格)

3个回答

2

如上所述,如果有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

2

使用PIVOT和UNPIVOT.

UNPIVOT 几乎是 PIVOT 的反向操作,通过将列旋转为行。假设前一个示例中生成的表作为 pvt 存储在数据库中,并且您想要将列标识符 Emp1, Emp2, Emp3, Emp4Emp5 旋转成对应于特定供应商的行值。这意味着您必须标识出两个附加列。将包含正在旋转的列值(Emp1, Emp2 等)的列称为 Employee,将保存当前位于旋转列下的值的列称为 Orders。这些列分别对应于 Transact-SQL 定义中的 pivot_columnvalue_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
...

谢谢您的回答。学会如何使用PIVOT让我今天节省了很多时间! - Eric Ness

1

无需导出到 SQL Server。在 Access 中,尝试使用 /View/PivotTable 视图子菜单。(至少在我的 Access 2003 中是这样的。)我比 Excel 中的更喜欢它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接