sql server中行转列
在sql2005之后,sqlserver引入了pivot运算符,也即是可以旋转行为列,它主要基于实体属性模型模型(EAV)数据库.
EAV模型数据库可以扩展数据库实体,而不需要进行数据库架构的修改。因而,eav存储实体的属性采用键值对模型的表;
举个栗子:
create table eav_table(
Id INT NOT NULL,
Attribute CHAR(100) NOT NULL,
Value SQL_VARIANT NOT NULL,
PRIMARY KEY (Id,Attribute)
)
go;
-- insert
insert eav_table(Id,Attribute,Value),
values
(1,"name","name"),
(1,"last_name","last_name"),
(1,"City","City"),
(1,"Country","Country"),
(2,"name","name2"),
(2,"last_name","last_name2"),
(2,"City","City2"),
(2,"Country","Country2"),
上面这个就是开放数据库架构的“魅力",如果我们想扩展更多实体属性,只需插入额外的记录即可,而不需要数据库架构的修改
那么当我们想实现如下的效果
ID name last_name City Country
1 name last_name City Country
2 name2 last_name2 City2 Country2
也就意味着 我们需要进行 行转列 ,那么有两种方式可以实现我们的需求
1、使用 pivot 运算符 2、使用case
那么我们接下来进行详细剖析
1、如果采用case 我们需要三个阶段实现 a、分组 b、摊开 c、聚合
在分组阶段将数据库表中分为不同的实体,也就是说我们要对Id进行group by
在摊开阶段将使用case将行转为列
在聚合阶段使用max为每行每列返回不同的结果
select Id,
max(case when Attribute = 'name' then Value end) as 'first_name',
max(case when Attribute = 'last_name' then Value end) as 'last_name',
max(case when Attribute = 'City' then Value end) as 'City',
max(case when Attribute = 'Country' then Value end) as 'Country'
from eav_table
group by Id
那么上面的sql也就完成了我们的需求
2、pivot运算符
这个运算符从sqlserver 2005引入,至今差不多10年了,使得我们实现行转列只需要一个运算符即可完成。往往说简单的背后隐藏着巨大的”boss bug“
select Id,name, last_name, city , country
from eav_table
pivot(max(Value) FOR Attribute IN (name, last_name,city,country)) as temp
go
那么执行上面的sql同样可以得到我们所需的结果
同时大家也发现在上面的sql中我们只指定分摊和聚合元素,却没有定义分组元素,其实分组元素也是pivot运行符剩下的列
那么随着而来就有新问题了,如果我们修改了数据库架构,新增一列
alter table eav_table add other char(10) go;
接着赋值:update eav_table set other = "test";
再次执行pivot就会出现 我们所不想看到的结果
也就是说如pivot分组不明确,导致结果并非我们所需的,那么我们就需要使用只返回我们所需的列的表表达式。即使后期再修改表 仍然不会对我们现有的结构有影响
select Id,name, last_name, city , country
from (
select Id,name, last_name, city , country
from eav_table
) as temp
pivot(max(Value) FOR Attribute IN (name, last_name,city,country)) as temp
go
小结:pivot运算符确实可以给我们带来非常高效的代码,同时它也具备副作用,不能执行分组元素,因此,需要借助一个表表达式作为辅助完成最终的结果
相关推荐
### SqlServer行转列 #### 知识点一:什么是行转列? 在数据库操作中,行转列(Pivot)是一种将数据表中的行数据转换为列数据的技术。这种技术通常用于改变数据的结构,使得原始数据更适合进一步的数据分析或报告...
T-SQL(Transact-SQL)是微软SQL Server所使用的扩展SQL语言,它提供了丰富的数据处理功能,包括行转列。在SQL Server中,有两种主要的方法可以实现这一转换: 1. 使用CASE语句: CASE语句是SQL中一个非常强大的...
列转行行转列
sqlserver 实现 行转列 split 分割的函数,具体使用方法写有在文件里。
sqlserver 动态行专列 避免了数据列过多的时候大量的使用case when then...... 原数据 : UserName Subject Score Nick 语文 80 Nick 数学 90 Nick 英语 70 Nick 生物 85 Kent 语文 80 Kent 数学 90 Kent ...
SqlServer如何进行行转列和列转行方法
sql server 用于行转列,省得各位去找语句,select to_char(wm_concat('''' || valuelabel || '''')) name from (select distinct t.valuelabel from structuredrecruit t) select * from (select t.uhid, t....
在SQL Server中,行转列是一种常见的数据转换需求,它将数据库中的行数据转换为列显示,以便于分析和报表制作。以下是对SQL Server行转列方法的详细解析。 首先,我们可以使用SQL Server的`PIVOT`操作来实现行转列...
在SQL Server中,"行转列"是一种常见的数据操作,它可以帮助我们把表格中的多行数据转换成一列,或者将某一列的数据转换为多列显示。这种技术在数据分析、报表制作以及信息展示中非常实用。本文将详细介绍SQL Server...
SQL 行转列+动态获取列名 通用的动态获取列名
### SQL Server 行转列操作详解 在数据库管理和数据分析领域,有时我们需要将表格中的行转换成列,这种操作称为“行转列”。行转列在实际应用中非常常见,尤其是在处理具有多维度的数据集时。例如,从一个记录学生...
在SQL Server数据库管理中,行转列是一种常见的数据操作需求,尤其在数据分析和报表生成时。本篇文章将深入探讨如何利用CASE语句解决这一问题,为你的数据处理提供高效的策略。 首先,我们要理解行转列的基本概念。...
行转列sql实例行转列sql实例行转列sql实例行转列sql实例行转列sql实例
在SQLServer中,行转列是一种常见的数据转换需求,它能将数据库中的一行数据转换为多列显示,尤其在数据分析和报表展示时非常有用。本文主要探讨了三种实现SQLServer行转列的方法:静态SQL、动态SQL以及CASE WHEN...
在SQL Server 2000中,由于缺乏直接支持行转列的内置函数或语句,通常需要通过动态SQL来实现。具体步骤如下: 1. **构建动态SQL语句**:首先,需要查询出所有需要被转换为列的值,并基于这些值构造动态SQL。 2. **...
在 SQL Server 中,“行转列”(Pivot)是一种常用的数据处理方式,它能够将表格中的行数据转换为列数据,从而使得数据更加易于理解和分析。这种方式特别适用于将汇总数据进行重新组织的情况。 #### 二、描述:代码...
标题与描述均提到“SQL行转列解决方案”,这主要指的是在SQL中将数据表中的行数据转换为列数据的一种操作技巧,通常应用于需要对多行数据进行汇总展示或数据分析的场景。这种转换对于数据报告、统计分析等业务需求至...
在SQL Server 2005中,我们经常遇到这样的需求:需要将数据库中的多行数据转换为多列显示,这通常被称为“行转列”或“行列互换”。这种操作在数据分析、报表制作或者简化数据显示时非常有用。本文将详细讲解如何在...