[英]How to convert fields into rows through SQL in MS Access 2007 or MS SQL Server 2005
我有一個傳統的MS Access 2007表,其中包含52個字段(一年中每周一個字段),表示歷史銷售數據(實際上是一年中的一個字段)。 我想將此數據庫轉換為更傳統的時間/價值列表。
有沒有人知道怎么做而不用52+顯式參數編寫查詢?
(如果MS SQL Server 2005下存在解決方案,我也可以導出/導入表)
通過將列旋轉到行,
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
...
如上所述,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更喜歡它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.