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

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.dtcms.com/a/347697.html

相关文章:

  • word——表格跨页显示表头
  • PCL点云库入门(第24讲)——PCL库点云特征之NARF特征描述 Normal Aligned Radial Feature(NARF)
  • VGG改进(4):融合Linear Attention的高效CNN设计与实践
  • 遥感机器学习入门实战教程|Sklearn案例⑧:评估指标(metrics)全解析
  • 机器学习案例——预测矿物类型(数据处理部分)
  • 如何在wsl2+Ubuntu中安装Eclipse
  • 第七章 利用Direct3D绘制几何体
  • 一个简洁的 C++ 日志模块实现
  • AI + 医疗:智能诊断如何突破技术瓶颈,走进基层医院?
  • Azure Kubernetes Service (AKS)
  • 在Linux环境中为Jupyter Lab安装Node.js环境
  • `sudo apt update` 总是失败
  • 【KO】前端面试六
  • X射线胸部肺炎检测:基于深度学习的医学影像分析项目
  • Trae Solo模式生成一个旅行足迹App
  • JS事件的概念
  • 【最后203篇系列】035 数据表同步简单方案
  • 深入理解 React useEffect
  • 语义普遍性与形式化:构建深层语义理解的统一框架
  • 串与数组:从字符处理到多维存储的数据结构详解
  • 【python】min(key=...)用法
  • 【Kubernetes知识点】资源配额与访问控制
  • 小白向:Obsidian(Markdown语法学习)快速入门完全指南:从零开始构建你的第二大脑(免费好用的笔记软件的知识管理系统)、黑曜石笔记
  • Redis学习笔记 ---- 基于token实现登录功能
  • 多媒体内容生成 - 超越文本的生产力
  • 使用自制的NTC测量模块测试Plecs的热仿真效果
  • python如何下载库——0基础教程
  • 【使用Unsloth 微调】数据集的种类
  • Linux|数据库|2025最新数据库管理工具cloudbeaver-25.0.1的docker方式部署和二进制方式部署
  • leetcode刷题记录03——top100题里的6道简单+1道中等题