10

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 クエリを呼び出したりしたいと考えているようです。ピボットしたい!


こちらもご覧ください


本当の質問TM

今日解決しようとしている本当の問題は、「ビジネス」から提供されたスクリーンショットのモックアップです。

ここに画像の説明を入力

SQL Server の構文が私にとってかなり明白である場合、これはかなり明白なクエリになる可能性があります。

SELECT 
    JobName, ShiftName, 
    Firstname+' '+Lastname+' - '+BankCode
FROM Transactions
GROUP BY JobName, ShiftName
PIVOT BY TransactionDate
4

1 に答える 1

4

ピボット演算子は、グループを置き換えるものと考えてください。サンプル #1 と 3 の例を次に示します。

SELECT name, [Chinese], [English], [Biology], [Maths]
FROM scores s
PIVOT (
    SUM(score) 
    FOR Class IN ([Chinese], [English], [Biology], [Maths])
) p

SELECT name, [70], [80], [85], [90]
FROM scores s
PIVOT (
    MAX(class) 
    FOR score IN ([70], [80], [85], [90])
) p
于 2012-09-24T18:34:40.580 に答える