当前位置: 首页 > web >正文

Sql server的行转列

业务场景:有如下一张表,希望汇总成下面的查询结果。
原始数据表 EmployeeTable:一个员工身兼多个岗位。
Employee    Role    Level
张三          工程师     3
张三          经理         5
李四         工程师      2
李四         主管         4
王五         操作工     8
希望查询结果:
Employee    工程师    经理    主管    操作工
张三                3               5    
李四               2                         4
王五                                                     8

其实这个需求就是一个行转列的过程。
1.传统的方法:case when
SELECT Employee,
MAX(CASE ROLW  WHEN '工程师' THEN LEVEL ELSE '' END) AS 工程师,
MAX(CASE ROLW  WHEN '经理' THEN LEVEL ELSE '' END) AS 经理,
MAX(CASE ROLW  WHEN '主管' THEN LEVEL ELSE '' END) AS 主管,
MAX(CASE ROLW  WHEN '操作工' THEN LEVEL ELSE '' END) AS 操作工
FROM EmployeeTable GROUP BY Employee    
缺点是:每添加一个岗位,这个查询就需要更新


2.方法二:PIVOT搭配聚合函数:
使用透视表,重新聚合实现行转列
SELECT *
FROM (
SELECT 
Employee, 
Role, 
Level
FROM EmployeeTable
) AS SourceTable
PIVOT (
MAX(Level)  -- 使用聚合函数(如 MAX/AVG)处理同一员工的重复岗位,作为值显示
FOR Role IN (
[工程师], [经理], [主管],[操作工]  -- 列出所有岗位名称, 指名道姓让这一列做新列
)
) AS PivotTable;
缺点是:和方法一样,每添加一个岗位,这个查询就需要更新

3.方法三:PIVOT搭配聚合函数+动态
先拼接成sql查询语句,然后再用sp_executesql执行获得结果。
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
-- 动态获取所有岗位名称
SELECT @columns = (
SELECT DISTINCT QUOTENAME(Role) + ','  -- 处理特殊字符(如空格)
FROM EmployeeTable
FOR XML PATH('')
);
SET @columns = LEFT(@columns, LEN(@columns) - 1);  -- 移除末尾逗号

-- 生成动态 PIVOT 查询
SET @sql = N'
SELECT Employee, ' + @columns + '
FROM (
SELECT Employee, Role, Level
FROM EmployeeTable
) AS SourceTable
PIVOT (
MAX(Level)
FOR Role IN (' + @columns + ')
) AS PivotTable;';

-- 执行动态 SQL
EXEC sp_executesql @sql;

实现动态查询。

http://www.xdnf.cn/news/18697.html

相关文章:

  • 数据结构:顺序表
  • C# 项目“交互式展厅管理客户端“针对的是“.NETFramework,Version=v4.8”,但此计算机上没有安装它。
  • 玳瑁的嵌入式日记D24-0823(数据结构)
  • 【基础-判断】使用http模块发起网络请求时,必须要使用on(‘headersReceive’)订阅请求头,请求才会成功。
  • 游戏广告投放数据分析项目:拆解投放的“流量密码”
  • 图像边缘检测
  • qwen2.5vl(2):lora 微调训练及代码讲解
  • Android Studio下载gradle文件很慢的捷径之路
  • 个人禁食伴侣FastTrack
  • 数据库类型与应用场景全解析:从传统关系型到新兴向量数据库
  • MySQL深分页的处理方案
  • React学习(十一)
  • 深入理解 React useEffect
  • 三、Bpmnjs 核心组件与架构介绍
  • 【c++进阶系列】:万字详解多态
  • 分库分表系列-基础内容
  • piecewise jerk算法介绍
  • 密码实现安全基础篇 . KAT(已知答案测试)技术解析与实践
  • SpringBoot自动配置原理解析
  • Reactor 反应堆模式
  • 游游的数组询问
  • SOC估算方法-蜣螂优化算法结合极限学习
  • NVIDIA Nsight Systems性能分析工具
  • 【Linux系统】进程信号:信号的处理
  • 【基础-判断】订阅dataReceiveProgress响应事件是用来接收HTTP流式响应数据。
  • 基于LLM的跨架构物联网静态漏洞挖掘检测 摘要
  • Ubuntu2204server系统安装postgresql14并配置密码远程连接
  • 小程序备案话术
  • 关于微服务下的不同服务之间配置不能通用的问题
  • pid自适应调节实战设计-基于输出电流的PI参数切换方案