Stackoverflow、Books Online、Google で多くの SQL Pivot の例を参照しましたが、単純なピボット操作を実行する方法 (私が呼ぶもの) をまだ理解できません。
例 1
サンプルデータ:
Name Class Score
======= ========== ======
Nick Chinese 80
Nick English 70
Nick Biology 85
Nick Maths 85
Kent Chinese 80
Kent Maths 90
Kent English 70
Kent Biology 85
望ましい出力 1 - クラスによるピボット、名前による集計
Name Chinese English Biology Maths
======= ========== ======== ======= ======
Nick 80 70 85 85
Kent 80 70 85 90
ノート:
私の頭では、構文は次のようになると思います。
SELECT Score FROM Scores GROUP BY Name PIVOT BY Class
望ましい出力 2 - クラスごとのピボット、集計スコア
Name Chinese English Biology Maths
======= ========== ======== ======= ======
70 Nick
70 Kent
80 Nick
80 Kent
85 Nick Nick
85 Kent
90 Kent
ノート:
私の頭では、構文は次のようになると思います。
SELECT Name FROM Scores GROUP BY Score PIVOT BY Class
望ましい出力 3 - スコアによるピボット、名前による集計
Name 70 80 85 90
======= ========== ======== ======= =====
Nick English Chinese Biology
Nick English Chinese Maths
Kent English Chinese Biology Maths
ノート:
私の頭では、構文は次のようになると思います。
SELECT Class FROM Scores GROUP BY Name PIVOT BY Score
望ましい出力 4 - スコアによるピボット、クラスによる集計
Class 70 80 85 90
======= ========== ======== ======= =====
Chinese Nick
Chinese Kent
English Nick
English Kent
Biology Nick
Biology Kent
Maths Nick Kent
私の頭では、構文は次のようになると思います。
SELECT Name FROM Scores GROUP BY Class PIVOT BY Score
望ましい出力 5 - 名前によるピボット、クラスによる集計
Class Nick Kent
======= ==== ====
Chinese 80 80
English 70 70
Biology 85 85
Maths 85 90
私の頭では、構文は次のようになると思います。
SELECT Score FROM Scores GROUP BY Class PIVOT BY Name
望ましい出力 6 - 名前によるピボット、スコアによる集計
Score Nick Kent
===== ======= =======
70 English English
80 Chinese Chinese
85 Biology Biology
85 Maths Biology
90 Maths
私の頭では、構文は次のようになると思います。
SELECT Class FROM Scores GROUP BY Score PIVOT BY Name
注:これらすべてのピボットを実行できる単一のクエリは必要ありません。サンプル データとサンプル ピボットを使用しているので、実行したいピボットの例として使用してください。
別の例セット
別の例として、ドメインへのユーザーのログインのログを解析することがあります。
LoginDate Username MachineName
================= ======== ===========
20120901 8:49:22 iboyd obsidian
20120901 9:10:19 nbach president
20120901 13:07:18 nback nichpc
20120902 8:58:38 iboyd obsidian
20120202 9:14:44 nbach president
20120902 18:34:43 iboyd harpax
20120903 8:57:13 iboyd obsidian
20120904 20:03:55 iboyd harpax
望ましい出力 7 - LoginDate の日付部分でピボットし、ユーザー名で集計:
Username 20120901 20120902 20120903 20120914
======== ========= ======== ======== ========
iboyd obsidian obsidian obsidian harpax
iboyd obsidian harpax obsidian harpax
nbach president president
nback nichpc president
私の頭では、構文は次のようになると思います。
SELECT MachineName FROM Logins GROUP BY Username PIVOT BY CONVERT(varchar(50), LoginDate, 112) --yyyymmdd format
多分:
SELECT MachineName FROM Logins GROUP BY Username PIVOT BY CAST(LoginDate AS DATE)
私は頭をPIVOT
構文から包み込むことができないようです。どの列の値が列になるか、どの列の値が集計されるかを SQL Server に伝えるためです。
誰もが、列をハードコーディングしたり、いくつかの XML クエリを呼び出したりしたいと考えているようです。ピボットしたい!
こちらもご覧ください
- ピボット SQL クエリ - 列に日付を表示
- https://stackoverflow.com/questions/tagged/pivot+sql-server
- テーブルをピボットするには?
- SQL フィドルの例
本当の質問TM
今日解決しようとしている本当の問題は、「ビジネス」から提供されたスクリーンショットのモックアップです。
SQL Server の構文が私にとってかなり明白である場合、これはかなり明白なクエリになる可能性があります。
SELECT
JobName, ShiftName,
Firstname+' '+Lastname+' - '+BankCode
FROM Transactions
GROUP BY JobName, ShiftName
PIVOT BY TransactionDate