sqlserver 行列互轉(zhuǎn)實(shí)現(xiàn)小結(jié)
--行列互轉(zhuǎn)
/******************************************************************************************************************************************************
以學(xué)生成績(jī)?yōu)槔樱容^形象易懂
整理人:中國(guó)風(fēng)(Roy)
日期:2008.06.06
******************************************************************************************************************************************************/
--1、行互列
--> --> (Roy)生成測(cè)試數(shù)據(jù)
if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
Insert Class
select N'張三',N'語(yǔ)文',78 union all
select N'張三',N'數(shù)學(xué)',87 union all
select N'張三',N'英語(yǔ)',82 union all
select N'張三',N'物理',90 union all
select N'李四',N'語(yǔ)文',65 union all
select N'李四',N'數(shù)學(xué)',77 union all
select N'李四',N'英語(yǔ)',65 union all
select N'李四',N'物理',85
Go
--2000方法:
動(dòng)態(tài):
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+' from Class group by [Student]')
生成靜態(tài):
select
[Student],
[數(shù)學(xué)]=max(case when [Course]='數(shù)學(xué)' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英語(yǔ)]=max(case when [Course]='英語(yǔ)' then [Score] else 0 end),
[語(yǔ)文]=max(case when [Course]='語(yǔ)文' then [Score] else 0 end)
from
Class
group by [Student]
GO
動(dòng)態(tài):
declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')
生成靜態(tài):
select *
from
Class
pivot
(max([Score]) for [Course] in([數(shù)學(xué)],[物理],[英語(yǔ)],[語(yǔ)文]))b
生成格式:
/*
Student 數(shù)學(xué) 物理 英語(yǔ) 語(yǔ)文
------- ----------- ----------- ----------- -----------
李四 77 85 65 65
張三 87 90 82 78
(2 行受影響)
*/
------------------------------------------------------------------------------------------
go
--加上總成績(jī)(學(xué)科平均分)
--2000方法:
動(dòng)態(tài):
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+',[總成績(jī)]=sum([Score]) from Class group by [Student]')--加多一列(學(xué)科平均分用avg([Score]))
生成動(dòng)態(tài):
select
[Student],
[數(shù)學(xué)]=max(case when [Course]='數(shù)學(xué)' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英語(yǔ)]=max(case when [Course]='英語(yǔ)' then [Score] else 0 end),
[語(yǔ)文]=max(case when [Course]='語(yǔ)文' then [Score] else 0 end),
[總成績(jī)]=sum([Score]) --加多一列(學(xué)科平均分用avg([Score]))
from
Class
group by [Student]
go
--2005方法:
動(dòng)態(tài):
declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一個(gè)逗號(hào)
exec('select [Student],'+@s+',[總成績(jī)] from (select *,[總成績(jī)]=sum([Score])over(partition by [Student]) from Class) a
pivot (max([Score]) for [Course] in('+@s+'))b ')
生成靜態(tài):
select
[Student],[數(shù)學(xué)],[物理],[英語(yǔ)],[語(yǔ)文],[總成績(jī)]
from
(select *,[總成績(jī)]=sum([Score])over(partition by [Student]) from Class) a --平均分時(shí)用avg([Score])
pivot
(max([Score]) for [Course] in([數(shù)學(xué)],[物理],[英語(yǔ)],[語(yǔ)文]))b
生成格式:
/*
Student 數(shù)學(xué) 物理 英語(yǔ) 語(yǔ)文 總成績(jī)
------- ----------- ----------- ----------- ----------- -----------
李四 77 85 65 65 292
張三 87 90 82 78 337
(2 行受影響)
*/
go
--2、列轉(zhuǎn)行
--> --> (Roy)生成測(cè)試數(shù)據(jù)
if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[數(shù)學(xué)] int,[物理] int,[英語(yǔ)] int,[語(yǔ)文] int)
Insert Class
select N'李四',77,85,65,65 union all
select N'張三',87,90,82,78
Go
--2000:
動(dòng)態(tài):
declare @s nvarchar(4000)
select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一個(gè)union all
+',[Score]='+quotename(Name)+' from Class'
from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不轉(zhuǎn)換的列
order by Colid
exec('select * from ('+@s+')t order by [Student],[Course]')--增加一個(gè)排序
生成靜態(tài):
select *
from (select [Student],[Course]='數(shù)學(xué)',[Score]=[數(shù)學(xué)] from Class union all
select [Student],[Course]='物理',[Score]=[物理] from Class union all
select [Student],[Course]='英語(yǔ)',[Score]=[英語(yǔ)] from Class union all
select [Student],[Course]='語(yǔ)文',[Score]=[語(yǔ)文] from Class)t
order by [Student],[Course]
go
--2005:
動(dòng)態(tài):
declare @s nvarchar(4000)
select @s=isnull(@s+',','')+quotename(Name)
from syscolumns where ID=object_id('Class') and Name not in('Student')
order by Colid
exec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')
go
select
Student,[Course],[Score]
from
Class
unpivot
([Score] for [Course] in([數(shù)學(xué)],[物理],[英語(yǔ)],[語(yǔ)文]))b
生成格式:
/*
Student Course Score
------- ------- -----------
李四 數(shù)學(xué) 77
李四 物理 85
李四 英語(yǔ) 65
李四 語(yǔ)文 65
張三 數(shù)學(xué) 87
張三 物理 90
張三 英語(yǔ) 82
張三 語(yǔ)文 78
(8 行受影響)
*/
相關(guān)文章
SQLServer用t-sql命令批量刪除數(shù)據(jù)庫(kù)中指定表(游標(biāo)循環(huán)刪除)
這篇文章主要介紹了SQLServer用t-sql命令批量刪除數(shù)據(jù)庫(kù)中指定表的方法,大家參考使用2013-11-11返回SQL執(zhí)行時(shí)間的存儲(chǔ)過(guò)程
返回任何SQL執(zhí)行時(shí)間(到毫秒,sql 2000)2009-10-10Sql2000數(shù)據(jù)庫(kù)的備份文件恢復(fù)到Sql2005的方法
真的和sql2000恢復(fù)方法不同,我用這里介紹的辦法恢復(fù)成功了2009-12-12SqlServer 復(fù)制中將大事務(wù)分成小事務(wù)分發(fā)的方法
日志讀取器代理可配置將大事務(wù)劃分為多個(gè)小事務(wù)進(jìn)行傳遞到分發(fā)數(shù)據(jù)庫(kù)中,分發(fā)隊(duì)列則按照小事務(wù)分發(fā)到訂閱數(shù)據(jù)庫(kù)中,這樣數(shù)據(jù)就很快同步2016-11-11sqlserver下Kill 所有連接到某一數(shù)據(jù)庫(kù)的連接
可以通過(guò)下面代碼Kill所有連接到某一數(shù)據(jù)庫(kù)的所有連接2010-05-05sql?server設(shè)置數(shù)據(jù)庫(kù)某個(gè)字段值不能重復(fù)兩種方法
sqlserver的表中有一個(gè)列不能有相同的值,如何保證每次插入該列的值都是不同的,這篇文章主要給大家介紹了關(guān)于sql?server設(shè)置數(shù)據(jù)庫(kù)某個(gè)字段值不能重復(fù)的兩種方法,需要的朋友可以參考下2023-11-11SQL入侵恢復(fù)xp_cmdshell方法總結(jié)
恢復(fù)xp_cmdshell SQL Server阻止了對(duì)組件 'xp_cmdshell' 的過(guò)程'sys.xp_cmdshell' 啟用2010-08-08SQL Server定時(shí)收縮數(shù)據(jù)庫(kù)日志為指定大小的示例代碼
SQL Server提供了DBCC SHRINKFILE 命令來(lái)清理事務(wù)日志文件,該命令可以縮小指定文件的大小,并釋放磁盤(pán)空間,本文給大家介紹了SQL Server如何定時(shí)收縮數(shù)據(jù)庫(kù)日志為指定大小,需要的朋友可以參考下2024-03-03