SQL server 列转行

在 SQL Server 中,将列转换为行的操作通常被称为"透视"(Pivot)的逆操作,即"反透视"(Unpivot)。SQL Server 提供了 UNPIVOT 关键字来实现这一功能。假设你有一个表 EmployeeDetails,其中包含员工的一些详细信息,如下所示:

sql 复制代码
CREATE TABLE EmployeeDetails (
    EmployeeID INT,
    Name VARCHAR(50),
    Age INT,
    Salary DECIMAL(10, 2),
    Department VARCHAR(50)
);

INSERT INTO EmployeeDetails (EmployeeID, Name, Age, Salary, Department)
VALUES 
(1, '张三', 30, 5000.00, '开发部'),
(2, '李四', 35, 6000.00, '市场部');

你希望将每一行的数据转换为多行,每行只包含一个属性值。可以使用 UNPIVOT 来实现这一点。

示例 SQL 查询

sql 复制代码
SELECT EmployeeID, Attribute, Value
FROM EmployeeDetails
UNPIVOT (
    Value FOR Attribute IN (Name, Age, Salary, Department)
) AS UnpivotedData;

结果执行上述查询后,

结果将会是:

解释

  1. UNPIVOT 关键字:UNPIVOT 关键字用于将列转换为行。

  2. Value FOR Attribute IN (Name, Age, Salary, Department):这部分指定了哪些列将被转换为行,并且指定了新的列名 Attribute 和 Value。

  3. AS UnpivotedData:给生成的结果集一个别名 UnpivotedData。

注意事项

•数据类型:确保所有被转换的列具有兼容的数据类型。如果列的数据类型不同,可能需要进行类型转换。

•性能:对于大数据量的表,UNPIVOT 操作可能会有一定的性能影响,需要根据实际情况进行优化。

示例:包含不同类型数据的转换

假设 EmployeeDetails 表中包含不同类型的数据,如字符串、整数和小数。可以使用 CAST 或 CONVERT 进行类型转换,以确保所有值都转换为相同的类型。

sql 复制代码
SELECT EmployeeID, Attribute, Value
FROM EmployeeDetails
UNPIVOT (
    Value FOR Attribute IN (
        CAST(Name AS VARCHAR(50)),
        CAST(Age AS VARCHAR(50)),
        CAST(Salary AS VARCHAR(50)),
        CAST(Department AS VARCHAR(50))
    )
) AS UnpivotedData;

结果

执行上述查询后,结果将会是:

相关推荐
隔窗听雨眠1 小时前
Oracle误Truncate操作恢复:从原理到实战的完整指南
数据库·oracle
Lethehong2 小时前
MySQL迁移如何做到零改造?四层兼容方案详解
数据库·mysql·adb
Json____2 小时前
五金制品行业-企业官网源码
java·大数据·数据库·企业站·wwwoop.com
深念Y3 小时前
Opencode Event 表写入优化方案
数据库·人工智能·ai·node.js·bug·优化·opencode
竹枝溪4 小时前
MySQL进阶:约束、多表设计、多表查询与事务
java·数据库·mysql·事务·子查询·acid·多表查询
weixin_431600444 小时前
NestJS 入门(9):连上数据库,SQL 写在哪?
数据库·后端·sql·学习·nest.js
math_hongfan5 小时前
一对多的数据库姻缘:ArkTS 为鸿蒙订单设计外键与明细表
数据库·华为·harmonyos
杰夫(简道云个人搭建)5 小时前
SAAS系统应该先解决业务问题,再优化体验
数据库·人工智能·低代码·excel·个人开发
城管不管5 小时前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
XLYcmy5 小时前
PDF论文处理器 - 功能总结
数据库·python·pdf·csv·pymupdf·dify·文本分割