我已经浏览了Stackoverflow上的很多SQL Pivot示例,在联机丛书和谷歌中,我仍然无法弄清楚如何执行(我会称之为)简单的数据透视操作.
样本数据:
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
Run Code Online (Sandbox Code Playgroud)
Name Chinese English Biology Maths
======= ========== ======== ======= ======
Nick 80 70 85 85
Kent 80 70 85 90
Run Code Online (Sandbox Code Playgroud)
注意:
在我脑海中,我想象的语法是:
Run Code Online (Sandbox Code Playgroud)SELECT Score FROM Scores GROUP BY Name PIVOT BY Class
Name Chinese English Biology Maths
======= ========== ======== ======= ======
70 Nick
70 Kent
80 Nick
80 Kent
85 Nick Nick
85 Kent
90 Kent
Run Code Online (Sandbox Code Playgroud)
注意:
在我脑海中,我想象的语法是:
Run Code Online (Sandbox Code Playgroud)SELECT Name FROM Scores GROUP BY Score PIVOT BY Class
Name 70 80 85 90
======= ========== ======== ======= =====
Nick English Chinese Biology
Nick English Chinese Maths
Kent English Chinese Biology Maths
Run Code Online (Sandbox Code Playgroud)
注意:
在我脑海中,我想象的语法是:
Run Code Online (Sandbox Code Playgroud)SELECT Class FROM Scores GROUP BY Name PIVOT BY Score
Class 70 80 85 90
======= ========== ======== ======= =====
Chinese Nick
Chinese Kent
English Nick
English Kent
Biology Nick
Biology Kent
Maths Nick Kent
Run Code Online (Sandbox Code Playgroud)
在我脑海中,我想象的语法是:
Run Code Online (Sandbox Code Playgroud)SELECT Name FROM Scores GROUP BY Class PIVOT BY Score
Class Nick Kent
======= ==== ====
Chinese 80 80
English 70 70
Biology 85 85
Maths 85 90
Run Code Online (Sandbox Code Playgroud)
在我脑海中,我想象的语法是:
Run Code Online (Sandbox Code Playgroud)SELECT Score FROM Scores GROUP BY Class PIVOT BY Name
Score Nick Kent
===== ======= =======
70 English English
80 Chinese Chinese
85 Biology Biology
85 Maths Biology
90 Maths
Run Code Online (Sandbox Code Playgroud)
在我脑海中,我想象的语法是:
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
Username 20120901 20120902 20120903 20120914
======== ========= ======== ======== ========
iboyd obsidian obsidian obsidian harpax
iboyd obsidian harpax obsidian harpax
nbach president president
nback nichpc president
Run Code Online (Sandbox Code Playgroud)
在我脑海中,我想象的语法是:
Run Code Online (Sandbox Code Playgroud)SELECT MachineName FROM Logins GROUP BY Username PIVOT BY CONVERT(varchar(50), LoginDate, 112) --yyyymmdd format也许:
Run Code Online (Sandbox Code Playgroud)SELECT MachineName FROM Logins GROUP BY Username PIVOT BY CAST(LoginDate AS DATE)
我似乎无法将PIVOT语法包括在内; 为了告诉SQL Server哪些列值应该成为列,以及聚合发生的列值.
每个人似乎都想对列进行硬编码,或者调用一些XML查询.我只想做一个支点!
我今天要解决的真正问题是"业务"给我的截图模型:

如果SQL Server语法对我来说相当明显,这可能是一个相当明显的查询查询:
SELECT
JobName, ShiftName,
Firstname+' '+Lastname+' - '+BankCode
FROM Transactions
GROUP BY JobName, ShiftName
PIVOT BY TransactionDate
Run Code Online (Sandbox Code Playgroud)
将枢轴运算符视为替换您的组。以下是示例 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
Run Code Online (Sandbox Code Playgroud)