簡體   English   中英

如何在MS Access 2007或MS SQL Server 2005中通過SQL將字段轉換為行

[英]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下存在解決方案,我也可以導出/導入表)

使用PIVOT和UNPIVOT

通過將列旋轉到行, UNPIVOT幾乎執行PIVOT的反向操作。 假設前一個示例中生成的表作為pvt存儲在數據庫中,並且您希望將列標識符Emp1Emp2Emp3Emp4Emp5為與特定供應商對應的行值。 這意味着您必須識別另外兩列。 包含要旋轉的列值的列( Emp1Emp2 ,...)將被稱為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
...

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM