SQL Server行列相互轉(zhuǎn)換的方法詳解
行轉(zhuǎn)列
創(chuàng)建語(yǔ)句:
create table test1(
id int identity(1,1) not null,
name varchar(255) null,
course varchar(255) null,
score int null,
)
insert into test1(name, course, score) values ('張三','語(yǔ)文', 80)
insert into test1(name, course, score) values ('張三','數(shù)學(xué)', 52)
insert into test1(name, course, score) values ('張三','英語(yǔ)', 150)
insert into test1(name, course, score) values ('李四','語(yǔ)文', 44)
insert into test1(name, course, score) values ('李四','數(shù)學(xué)', 111)
insert into test1(name, course, score) values ('李四','英語(yǔ)', 110)
insert into test1(name, course, score) values ('王五','語(yǔ)文', 140)
insert into test1(name, course, score) values ('王五','數(shù)學(xué)', 80)
insert into test1(name, course, score) values ('王五','英語(yǔ)', 92)
insert into test1(name, course, score) values ('王五','物理', 77)
insert into test1(name, course, score) values ('王五','化學(xué)', 65)
原始數(shù)據(jù):

1、第一種方法:
-- 使用case when then else ,這里也可以使用sum函數(shù) select name, max(case course when '語(yǔ)文' then score else 0 end) as chinese, max(case course when '數(shù)學(xué)' then score else 0 end) as math, max(case course when '英語(yǔ)' then score else 0 end) as english, max(case course when '物理' then score else 0 end) as wuli, max(case course when '化學(xué)' then score else 0 end) as huaxue from test1 group by name
第一種結(jié)果:

2、第二種方法:
-- 使用pivot函數(shù)行轉(zhuǎn)列 select name,max(t.語(yǔ)文)as chinese,max(t.數(shù)學(xué))as math,max(t.英語(yǔ))as english,max(t.物理)as wuli,max(t.化學(xué))as huaxue from test1 pivot(max(score) for course in(語(yǔ)文,數(shù)學(xué),英語(yǔ),物理,化學(xué)))t group by name
第二種結(jié)果:

3、第三種方法:
有兩種寫(xiě)法:
-- 第一種寫(xiě)法,動(dòng)態(tài)sql拼接,有多少行可以進(jìn)行動(dòng)態(tài)拼接sql,在列不確定的情況下可以使用
declare @sql_str varchar(8000); -- 要執(zhí)行的sql
declare @sql_col varchar(8000);
select @sql_col = isnull(@sql_col + ',','') + quotename(course)
from test1 group by course;
print(@sql_col); -- 打印數(shù)值列,不必需
set @sql_str = 'select * from (select name,course,score from test1)p pivot(sum(score) for course IN ( '+ @sql_col +'))as pvt order by pvt.name'
print (@sql_str);--打印執(zhí)行的sql
exec (@sql_str);-- 執(zhí)行查詢(xún)
--第二種寫(xiě)法
declare @name varchar(100);
declare @max varchar(1000);
declare @sql nvarchar(4000);
select @name= stuff(
(select ','+course+'' from test1 group by course for xml path('')),1,1,'');
select @max= stuff(
(select ',max('+course+') as '+course+'' from test1 group by course for xml path('')),1,1,'');
set @sql='select name,'+@max+' from test1 pivot (max(score) for course in('+@name+')) css group by name';
exec(@sql);
第三種結(jié)果:
兩種寫(xiě)法都是一樣的結(jié)果

4、第四種方法:
-- 使用distinct select distinct a.name, (select score from test1 b where a.name=b.name and b.course='語(yǔ)文' ) as 'chinese', (select score from test1 b where a.name=b.name and b.course='數(shù)學(xué)' ) as 'math', (select score from test1 b where a.name=b.name and b.course='英語(yǔ)' ) as 'english', (select score from test1 b where a.name=b.name and b.course='物理' ) as 'wuli', (select score from test1 b where a.name=b.name and b.course='化學(xué)' ) as 'huaxue' from test1 a
第四種結(jié)果:

列轉(zhuǎn)行
創(chuàng)建語(yǔ)句:
create table test2(
id int identity(1,1) not null,
name varchar(255) null,
chinese int null,
math int null,
english int null,
wuli int null,
huaxue int null
)
insert into test2(name,chinese,math,english,wuli,huaxue) values ('張三',110,120,85,null,null);
insert into test2(name,chinese,math,english,wuli,huaxue) values ('李四',130,88,89,null,null);
insert into test2(name,chinese,math,english,wuli,huaxue) values ('王五',93,124,87,98,67);
原始數(shù)據(jù):

1、第一種方法:
union all與union的區(qū)別:
union all對(duì)結(jié)果集不會(huì)去除重復(fù)的結(jié)果,union會(huì)去除重復(fù)的結(jié)果
--第一種寫(xiě)法: select row_number() over(order by id desc) as id,name,t.course,t.score from( select id,name,course='語(yǔ)文',score=chinese from test2 union all select id,name,course='數(shù)學(xué)',score=math from test2 union all select id,name,course='英語(yǔ)',score=english from test2 union all select id,name,course='物理',score=wuli from test2 union all select id,name,course='化學(xué)',score=huaxue from test2 ) t where score is not null order by id asc -- 下面可以不用執(zhí)行,執(zhí)行上面即可 ,case t.course when '語(yǔ)文' then 1 when '數(shù)學(xué)' then 2 when '英語(yǔ)' then 3 when '物理' then 4 when '化學(xué)' then 5 end -- 第二種寫(xiě)法: select row_number() over(order by id desc) as id,name,t.course,t.score from( select id,name,'語(yǔ)文' as course, chinese as 'score' from test2 union select id,name,'數(shù)學(xué)' as course, math as 'score' from test2 union select id,name,'英語(yǔ)' as course, english as 'score' from test2 union select id,name,'物理' as course, wuli as 'score' from test2 union select id,name,'化學(xué)' as course, huaxue as 'score' from test2 ) t where score is not null order by id asc -- 下面可以不用執(zhí)行,執(zhí)行上面即可 ,case t.course when '語(yǔ)文' then 1 when '數(shù)學(xué)' then 2 when '英語(yǔ)' then 3 when '物理' then 4 when '化學(xué)' then 5 end
第一種結(jié)果:
兩種寫(xiě)法結(jié)果都是一樣的

2、第二種方法:
--使用unpivot進(jìn)行列轉(zhuǎn)行 select row_number() over(order by id desc) as id,name,score,course from test2 unpivot( score for course in(chinese,math,english,wuli,huaxue))a
第二種結(jié)果:

以上就是SQL Server行列相互轉(zhuǎn)換的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于SQL Server行列相互轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
自動(dòng)備份mssql server數(shù)據(jù)庫(kù)并壓縮的批處理腳本
windows下,使用mssql命令行工具sqlcmd備份數(shù)據(jù)庫(kù),并調(diào)用rar壓縮;不借助mssql"維護(hù)計(jì)劃"功能,拜托權(quán)限問(wèn)題。2011-07-07
安裝SQL Server 2016出錯(cuò)提示:需要安裝oracle JRE7 更新 51(64位)或更高版本問(wèn)題的解決方法
這篇文章主要介紹了安裝SQL Server 2016出錯(cuò)提示:需要安裝oracle JRE7 更新 51(64位)或更高版本問(wèn)題的解決方法,需要的朋友可以參考下2018-03-03
數(shù)據(jù)庫(kù)日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(1)
下面小編就為大家?guī)?lái)一篇數(shù)據(jù)庫(kù)基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
SQLServer查詢(xún)所有數(shù)據(jù)庫(kù)名和表名及表結(jié)構(gòu)等代碼示例
SQL Server是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),可以使用SQL語(yǔ)言來(lái)查詢(xún)表結(jié)構(gòu),這篇文章主要給大家介紹了關(guān)于SQLServer查詢(xún)所有數(shù)據(jù)庫(kù)名和表名及表結(jié)構(gòu)等的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
多表關(guān)聯(lián)同時(shí)更新多條不同的記錄方法分享
因?yàn)轫?xiàng)目要求實(shí)現(xiàn)一次性同時(shí)更新多條不同的記錄的需求,和同事討論了一個(gè)比較不錯(cuò)的方案,這里供大家參考下2011-10-10
MyBatis MapperProvider MessageFormat拼接批量SQL語(yǔ)句執(zhí)行報(bào)錯(cuò)的原因分析及解決辦法
這篇文章主要介紹了MyBatis MapperProvider MessageFormat拼接批量SQL語(yǔ)句執(zhí)行報(bào)錯(cuò)的原因分析及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-01-01
Sql server 2012 中文企業(yè)版安裝圖文教程(附下載鏈接)
這篇文章主要介紹了Sql server 2012 中文企業(yè)版安裝圖文教程(附下載鏈接),需要的朋友可以參考下2020-04-04
分組后分組合計(jì)以及總計(jì)SQL語(yǔ)句(稍微整理了一下)
這篇文章主要介紹了分組后分組合計(jì)以及總計(jì)SQL語(yǔ)句,需要的朋友可以參考下2017-02-02
sqlserver exists,not exists的用法
exists,not exists的使用方法示例,需要的朋友可以參考下。2009-12-12

