SQL Server 行转列相关内容

  • 主要为动态SQL和静态SQL 的写法(一列转多行)

新建表
if exists (select * from sysobjects where id = OBJECT_ID(N'[tbs]') and OBJECTPROPERTY(id,N'IsUserTable') =1)
drop table tbs;
-- 如果tbs存在,就删掉tbs
-- 创建 tbs
Create table tbs(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tbs values('张三' , '语文' , 76)
insert into tbs values('张三' , '数学' , 85)
insert into tbs values('张三' , '英语' , 76)
insert into tbs values('张三' , '化学' , 85)
insert into tbs values('张三' , '生物' , 79)
insert into tbs values('张三' , '地理' , 88)
insert into tbs values('张三' , '政治' , 90)
insert into tbs values('张三' , '物理' , 98)
insert into tbs values('李四' , '语文' , 89)
insert into tbs values('李四' , '数学' , 78)
insert into tbs values('李四' , '英语' , 98)
insert into tbs values('李四' , '化学' , 78)
insert into tbs values('李四' , '生物' , 67)
insert into tbs values('李四' , '地理' , 85)
insert into tbs values('李四' , '政治' , 97)
insert into tbs values('李四' , '物理' , 49)
insert into tbs values('王五' , '语文' , 86)
insert into tbs values('王五' , '数学' , 78)
insert into tbs values('王五' , '英语' , 93)
insert into tbs values('王五' , '化学' , 97)
insert into tbs values('王五' , '生物' , 97)
insert into tbs values('王五' , '地理' , 86)
insert into tbs values('王五' , '政治' , 85)
insert into tbs values('王五' , '物理' , 93)
GO
命令已成功完成。
查询表
select * from tbs;
张三	语文	76
张三	数学	85
张三	英语	76
张三	化学	85
张三	生物	79
张三	地理	88
张三	政治	90
张三	物理	98
李四	语文	89
李四	数学	78
李四	英语	98
李四	化学	78
李四	生物	67
李四	地理	85
李四	政治	97
李四	物理	49
王五	语文	86
王五	数学	78
王五	英语	93
王五	化学	97
王五	生物	97
王五	地理	86
王五	政治	85
王五	物理	93
行转列 静态SQL
-- ①行转列     静态SQL    SQL Server2000
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '英语' then 分数 else 0 end) 英语,
max(case 课程 when '化学' then 分数 else 0 end) 化学,
max(case 课程 when '生物' then 分数 else 0 end) 生物,
max(case 课程 when '地理' then 分数 else 0 end) 地理,
max(case 课程 when '政治' then 分数 else 0 end) 政治,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tbs
group by 姓名;

-- ②行转列   静态SQL    SQL Server2005
select * from (select * from tbs) a
pivot
(max(分数) for 课程 in (语文,数学,英语,化学,生物,地理,政治,物理)) b;

  • 结果
姓名	语文	数学	英语	化学	生物	地理	政治	物理
李四	89	78	98	78	67	85	97	49
王五	86	78	93	97	97	86	85	93
张三	76	85	76	85	79	88	90	98
行转列 动态SQL
-- ③行转列  动态SQL   SQL SERVER 2000
declare @sql varchar(2000)
set @sql = 'select 姓名'
select @sql = @sql + ',max(case 课程 when '''+ 课程 + ''' then 分数 else 0 end) ['+ 课程 +'] '
from (select distinct 课程 from tbs) a
set @sql = @sql + 'from tbs group by 姓名'
exec(@sql);

-- ④行转列 动态SQL SQL SERVER 2005
declare @sql varchar(2000)
select @sql = isnull(@sql +'],[' ,'') +课程 from tbs group by 课程
set @sql = '[' + @sql +']'
exec('select * from (select * from tbs) a pivot(max(分数) for 课程 in ('+ @sql +'))b')

  • 结果
姓名	地理	化学	生物	数学	物理	英语	语文	政治
李四	85	78	67	78	49	98	89	97
王五	86	97	97	78	93	93	86	85
张三	88	85	79	85	98	76	76	90
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐