首页 游戏 软件 资讯 排行榜 专题
首页
数据库
玩转-SQL2005数据库行列转换

玩转-SQL2005数据库行列转换

热心网友
61
转载
2026-04-30

SQL Server 列转行创新方法:独家利用 SysColumns 系统表实现

在 SQL Server 数据转换中,列转行操作常常让开发者感到棘手。本文分享一种高效且独特的实现思路,该方法巧妙运用了系统表 SysColumns,经过笔者实践验证,在常规方案之外提供了一种新颖的解决方案。下面我们将从基础的行转列讲起,逐步深入至核心的列转行技巧。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

(一)SQL Server 行转列标准实现方法

行转列(PIVOT)是数据处理中的常见需求,其核心目标是将行数据中的特定值转换为结果集中的多个列。标准方法是结合动态 SQL 与 CASE WHEN 条件判断来实现。

首先,我们通过一个直观的效果图来明确转换目标:

第一步:创建测试数据表
我们首先建立一个学生成绩表,用于后续的演示:

复制代码

代码如下:
CREATE TABLE RowTest(
   [Name] [nvarchar](10) NULL,--學生姓名
   [Course] [nvarchar](10) NULL,--課程科目
   [Record] [int] NULL--考試分數
)

第二步:插入模拟数据
向表中添加结构化的测试数据,以便清晰展示转换过程:

复制代码

代码如下:
insert into RowTest values ('张三','语文','91')
insert into RowTest values ('张三','数学','92')
insert into RowTest values ('张三','英语','93')
insert into RowTest values ('张三','生物','94')
insert into RowTest values ('张三','物理','95')
insert into RowTest values ('张三','化学','96')

insert into RowTest values ('李四','语文','81')
insert into RowTest values ('李四','数学','82')
insert into RowTest values ('李四','英语','83')
insert into RowTest values ('李四','生物','84')
insert into RowTest values ('李四','物理','85')
insert into RowTest values ('李四','化学','86')

insert into RowTest values ('小生','语文','71')
insert into RowTest values ('小生','数学','72')
insert into RowTest values ('小生','英语','73')
insert into RowTest values ('小生','生物','74')
insert into RowTest values ('小生','物理','75')
insert into RowTest values ('小生','化学','76')

第三步:实现原理深度解析
行转列的本质是将“课程”字段中的不同取值动态地映射为结果集的列标题。技术实现上,通过 CASE WHEN 语句将对应课程的分数值填充到新生成的列中,最后使用 GROUP BY 按学生姓名进行聚合,实现一行显示所有成绩。

第四步:编写通用动态 SQL 脚本
为了适应课程科目可能动态变化的情况,采用动态 SQL 是更通用的解决方案:

复制代码

代码如下:
declare @sql nvarchar(max)
set @sql='select Name'
select @sql=@sql+','+'isnull(max( case when Course='''+TCourse.Course+''' then Record end ),0) as ['+TCourse.Course+']'
  from (select distinct Course from RowTest)TCourse

set @sql=@sql+' from RowTest group by Name order by Name'

print @sql
exec(@sql)

关键技术点说明:
此脚本首先获取所有不重复的课程名称,构成一个临时集合(TCourse)。随后通过字符串拼接循环,为每一门课程生成对应的 CASE WHEN 条件列,最终组装成完整的、可执行的查询语句,完美实现动态行转列。

第五步:扩展场景与边界测试
1. 处理重复数据: 假设为“小生”额外添加一条生物课成绩:

复制代码

代码如下:
insert into dbo.RowTest values ('小生','生物','110')

此时,若动态 SQL 中省略 MAX() 聚合函数,执行将会报错。原因在于同一学生同一课程出现多行记录时,必须通过聚合函数来确定最终显示哪一个数值。

2. 测试动态扩展性: 新增一门“计算机”课程数据:

复制代码

代码如下:
insert into dbo.RowTest values ('小生','計算機','110')

再次执行之前的动态 SQL,会发现结果集中自动增加了“计算机”列。对于未选修该课程的学生,其对应列值显示为 0。这充分证明了该方法的灵活性与可扩展性。

至此,SQL Server 行转列的通用实现方法已完整阐述。

(二)SQL Server 列转行独家创新方案

接下来重点探讨更具挑战性的列转行(UNPIVOT)操作。传统方法依赖多个 UNION ALL 语句,代码冗长且不易维护。笔者提出一种基于系统表的新思路,更为简洁高效。

列转行的目标效果如下图所示:

第一步:创新思路揭秘
常见方案需要为每一列手动编写 UNION ALL 子句,列数增加时代码量同步增长。本文的创新方法核心在于:首先,动态获取目标表除主键(或姓名列)外的所有列名,这通过查询系统表 SysColumns 实现。然后,将原表与这个“列名结果集”进行关联,从而将一行数据“展开”成多行(每行对应一个列名)。最后,通过条件判断动态获取原表对应列的值。

第二步:构建列式存储测试表
创建一个典型的宽表结构,各科目成绩以独立列的形式存储:

复制代码

代码如下:
create table CoulumTest
(
  Name nvarchar(10),
  语文  int,
  数学 int,
  英语 int
)

第三步:准备测试数据
向表中插入示例数据:

复制代码

代码如下:
insert into CoulumTest values(N'张三',90,91,92)
insert into CoulumTest values(N'李四',80,81,82)

第四步:核心实现代码解析
关键实现仅需一条查询语句,极大简化了操作:

复制代码

代码如下:
select CT.Name, Col.name as 课程,
(case when Col.name=N'语文' then CT.语文
      when Col.name=N'数学' then CT.数学
      when Col.name=N'英语' then CT.英语
 end ) as 分数
from CoulumTest CT
left join (select name from SysColumns Where id=Object_Id('CoulumTest')) Col on Col.name <> 'Name'

这条语句的精妙之处在于:通过左连接系统表 SysColumns,获取当前表的所有列名,并过滤掉非转换列(如‘Name’)。然后,利用 CASE WHEN 语句,根据匹配到的列名,从原表对应列中取出数值。

当然,此方法仍有优化空间:目前的 CASE WHEN 需要显式列出每个列名。是否存在一种更通用的方式,能够直接根据 Col.name 动态引用 CT 表中的列,而无需硬编码条件分支?这作为一个开放性问题,留给读者进一步思考和探索,也欢迎更多数据库高手分享更优解。

来源:https://www.jb51.net/article/43764.htm
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

玩转-SQL2005数据库行列转换
数据库
玩转-SQL2005数据库行列转换

SQL Server 列转行创新方法:独家利用 SysColumns 系统表实现 在 SQL Server 数据转换中,列转行操作常常让开发者感到棘手。本文分享一种高效且独特的实现思路,该方法巧妙运用了系统表 SysColumns,经过笔者实践验证,在常规方案之外提供了一种新颖的解决方案。下面我们将

热心网友
04.30
数据库(DB)和数据仓库(DW)的区别
数据库
数据库(DB)和数据仓库(DW)的区别

文章主标题(保留原文) 今天,我们就来深入探讨一个核心问题。许多人在执行过程中常常感到困惑:为何付出同等努力,结果却大相径庭?这背后,一个至关重要的环节往往被大多数人忽略了。 第一个核心概念:理解底层运行逻辑 事实可能出乎你的意料。绝大多数人在起步阶段就陷入了误区,他们热衷于追逐复杂的技巧,却忽视了

热心网友
04.30
MySQL修改数据库:ALTER DATABASE用法简介
数据库
MySQL修改数据库:ALTER DATABASE用法简介

数据库的构建并非一劳永逸。在实际项目开发和运维过程中,随着业务逻辑的演进或系统平台的迁移,调整数据库的全局配置参数是常见的需求。本文将详细介绍如何对已存在的MySQL数据库进行修改,特别是其默认字符集和校对规则。 基本语法 在MySQL中,若要修改数据库的全局属性,例如其默认字符集或排序规则,需要使

热心网友
04.30
浅析数据库与数据仓库
数据库
浅析数据库与数据仓库

数据库与数据仓库:别再傻傻分不清楚 说到“数据库”,相信大家都不陌生,但一提起“数据仓库”,很多人可能就开始犯嘀咕了。这两个概念听起来像兄弟,实际用起来却大相径庭,常常让人混淆。今天,咱们就来彻底捋一捋,把数据库和数据仓库的那点事儿讲清楚。 一、数据管理发展历程 要想搞懂区别,得先看看它们从哪儿来。

热心网友
04.30
Berkeley DB 开源的文件数据库
数据库
Berkeley DB 开源的文件数据库

开源的文件数据库,介于关系数据库和内存数据库之间,按键值对方式存储 光说概念可能有点抽象,咱们直接来看一个具体的例子。下面的代码片段是我从网上找到并经过本地验证的,能帮你快速理解它的基本操作。 package org; import ja va io File; import ja va io Un

热心网友
04.29

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

小米SU7车主引奥迪互动,新老品牌山脊赛道共赴热爱
娱乐
小米SU7车主引奥迪互动,新老品牌山脊赛道共赴热爱

2026年4月2日,一场始于订单的“双向奔赴” 汽车圈最近上演了一出颇有温度的品牌互动,起因是一张来自社交平台的购车订单。一位原奥迪车主公开晒出了小米SU7的订单截图,并向相关负责人致以问候。这原本只是一条个人动态,却没承想,引发了一连串超出预期的友好回应。 消息传出后,上汽奥迪的反应堪称迅速且巧妙

热心网友
04.30
特斯拉2026年Q1电动车产销双增,加速布局Robotaxi与人形机器人量产
娱乐
特斯拉2026年Q1电动车产销双增,加速布局Robotaxi与人形机器人量产

特斯拉2026年Q1财报解读:业绩稳健增长,自动驾驶与机器人战略加速落地 2026年第一季度,特斯拉再次向市场展示了其强劲的发展动能。在全球电动汽车市场,特斯拉产量成功突破40 8万辆,实现同比12 7%的稳健增长;同期交付量达到35 8万辆,同比增长6 5%。与此同时,特斯拉储能业务表现突出,总装

热心网友
04.30
我的世界愚人节更新移除仓库系统,地面直取物品引热议
娱乐
我的世界愚人节更新移除仓库系统,地面直取物品引热议

四月一日,沙盒游戏我的世界推出一次特别更新,引发广泛关注 话说回来,四月的第一天,经典沙盒游戏《我的世界》,就整了个“大活儿”。一项听起来颇有碘伏性的设计调整,在社区内炸开了锅:游戏直接移除了沿用已久的仓库系统,改为所有物品都能随手放在地面,想用的时候捡起来就行。 仓库功能向来是此类建造型游戏的核心

热心网友
04.30
某巨鲸从Kraken提取4,472枚ETH,当前持仓市值约2,000万美元
web3.0
某巨鲸从Kraken提取4,472枚ETH,当前持仓市值约2,000万美元

巨鲸再出手:千万美元级ETH悄然离场 市场总是静水深流。就在今天,链上数据捕捉到一笔值得玩味的动向。根据链上分析师Onchain Lens的监测,大约三小时前,一个地址尾号为“24d4”的巨鲸,从知名交易所Kraken一口气提取了4,472枚ETH。按当前市价估算,这笔资产价值接近一千万美元。 这可

热心网友
04.30
京东京造推黄金气囊磁吸支架:含1克99.99%黄金,售价1199元
娱乐
京东京造推黄金气囊磁吸支架:含1克99.99%黄金,售价1199元

京东京造再推黄金配件新品:磁吸支架以亲民价格亮相 关注京东京造的朋友一定还记得此前推出的黄金手机壳,因其独特设计与高纯度金材质引发了不少讨论。如今品牌再度升级,带来了一款更贴近日常使用的“轻量化”黄金配件——黄金气囊手机磁吸支架,进一步降低了黄金数码配件的入手门槛。 产品解析:含金量与设计亮点 这款

热心网友
04.30