SqlServer PIVOT行转列

 PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。


 

 测试数据

复制代码

INSERT INTO [TestRows2Columns] ([UserName],[Subject],[Source])
SELECT N'张三',N'语文',60 UNION ALL
SELECT N'李四',N'数学',70 UNION ALL
SELECT N'王五',N'英语',80 UNION ALL
SELECT N'王五',N'数学',75 UNION ALL
SELECT N'王五',N'语文',57 UNION ALL
SELECT N'李四',N'语文',80 UNION ALL
SELECT N'张三',N'英语',100
GO

复制代码

select UserName,
sum(CASE Subject WHEN '数学' THEN Source ELSE 0 END)as 数学
,sum(CASE Subject WHEN '英语' THEN Source ELSE 0 END) as 英语
,sum(CASE Subject WHEN '语文' THEN Source ELSE 0 END) as 语文
from [TestRows2Columns]
GROUP BY UserName


 

PIVOT行转列

复制代码

SELECT *
FROM( SELECT [UserName] ,
[Subject] ,
[Source]
FROM[TestRows2Columns]
) p PIVOT
( SUM([Source]) FOR [Subject] IN ( [数学],[英语],[语文] ) ) AS pvt
ORDER BY pvt.[UserName];
GO

复制代码


 

 PIVOT求参加每项的次数

SELECT '总数' AS [总次数],
[数学],[英语],[语文] 
from (SELECT Subject as [科目],[id]
from TestRows2Columns)as tbl PIVOT
( COUNT([id])for tbl.[科目] IN([数学],[英语],[语文]))as tbl

SELECT '总数' AS [总次数], [数学],[英语],[语文] --(选择行转列后的结果集的列)这里可以用“*”表示选择所有列,也可以只选择某些列(也就是某些科目)
from (SELECT Subject as [科目],[id] from TestRows2Columns)as tbl PIVOT 查询所有科目和对应id号
( COUNT([id])for tbl.[科目] IN([数学],[英语],[语文]))as tbl将列科目里面的值 分别转换成列并计算每个列的数量

行转列后,原来的某个列的值变做了列名,在这里就是原来Subject列的值“数学”,"语文"...做了列名,而我们需要做的另一个工作就是计算这些列的值(这里的“计算”其实就是PIVOT里面的聚合函数(sum,COUNT等))

posted @   HueiFeng  阅读(538)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示