MS Access 2007またはMS SQL Server 2005でSQLを使用してフィールドを行に変換する方法
-
22-07-2019 - |
質問
過去の販売データを表す52のフィールド(年の各週に1つのフィールド)を含むレガシーMS Access 2007テーブルがあります(実際にはその年の1つのフィールド)。このデータベースをより一般的な時間/値リストに変換したいと思います。
52以上の明示的なパラメータを使用してクエリを記述することなく、その方法を知っている人はいますか
(MS SQL Server 2005の下にソリューションが存在する場合、テーブルをエクスポート/インポートすることもできます)
解決
UNPIVOT
はほぼ逆の動作をします 回転によるPIVOT
の操作 列を行に。テーブルを仮定します 前の例で生成されたものはpvt
としてデータベースに保存され、そして 列識別子を回転させたいEmp1
、Emp2
、Emp3
、Emp4
、およびEmp5
に対応する行の値 特定のベンダー。これは、あなたが 2つの追加列を識別する必要があります。 を含む列 回転している列の値 (Emp1
、Emp2
、...)が呼び出されますEmployee
、および列 現在存在する値を保持する 回転する列の下に 注文と呼ばれます。これらの列 pivot_column に対応し、 それぞれ value_column Transact-SQL定義。こちらが クエリ。
--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アプローチは次のとおりです。
特定の週の列を同じ列名エイリアスでエイリアスする、複数の選択ステートメント(週ごとに1つ)を結合します
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のものよりも気に入っています。