sqlserver 行列互轉實現小結
/******************************************************************************************************************************************************
以學生成績為例子,比較形象易懂
整理人:中國風(Roy)
日期:2008.06.06
******************************************************************************************************************************************************/
--1、行互列
--> --> (Roy)生成測試資料
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'語文',78 union all
select N'張三',N'數學',87 union all
select N'張三',N'英語',82 union all
select N'張三',N'物理',90 union all
select N'李四',N'語文',65 union all
select N'李四',N'數學',77 union all
select N'李四',N'英語',65 union all
select N'李四',N'物理',85
Go
--2000方法:
動態:
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]')
生成靜態:
select
[Student],
[數學]=max(case when [Course]='數學' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英語]=max(case when [Course]='英語' then [Score] else 0 end),
[語文]=max(case when [Course]='語文' then [Score] else 0 end)
from
Class
group by [Student]
GO
動態:
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')
生成靜態:
select *
from
Class
pivot
(max([Score]) for [Course] in([數學],[物理],[英語],[語文]))b
生成格式:
/*
Student 數學 物理 英語 語文
------- ----------- ----------- ----------- -----------
李四 77 85 65 65
張三 87 90 82 78
(2 行受影響)
*/
------------------------------------------------------------------------------------------
go
--加上總成績(學科平均分)
--2000方法:
動態:
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+',[總成績]=sum([Score]) from Class group by [Student]')--加多一列(學科平均分用avg([Score]))
生成動態:
select
[Student],
[數學]=max(case when [Course]='數學' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英語]=max(case when [Course]='英語' then [Score] else 0 end),
[語文]=max(case when [Course]='語文' then [Score] else 0 end),
[總成績]=sum([Score]) --加多一列(學科平均分用avg([Score]))
from
Class
group by [Student]
go
--2005方法:
動態:
declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字串@s中第一個逗號
exec('select [Student],'+@s+',[總成績] from (select *,[總成績]=sum([Score])over(partition by [Student]) from Class) a
pivot (max([Score]) for [Course] in('+@s+'))b ')
生成靜態:
select
[Student],[數學],[物理],[英語],[語文],[總成績]
from
(select *,[總成績]=sum([Score])over(partition by [Student]) from Class) a --平均分時用avg([Score])
pivot
(max([Score]) for [Course] in([數學],[物理],[英語],[語文]))b
生成格式:
/*
Student 數學 物理 英語 語文 總成績
------- ----------- ----------- ----------- ----------- -----------
李四 77 85 65 65 292
張三 87 90 82 78 337
(2 行受影響)
*/
go
--2、列轉行
--> --> (Roy)生成測試資料
if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[數學] int,[物理] int,[英語] int,[語文] int)
Insert Class
select N'李四',77,85,65,65 union all
select N'張三',87,90,82,78
Go
--2000:
動態:
declare @s nvarchar(4000)
select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字串@s中第一個union all
+',[Score]='+quotename(Name)+' from Class'
from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不轉換的列
order by Colid
exec('select * from ('+@s+')t order by [Student],[Course]')--增加一個排序
生成靜態:
select *
from (select [Student],[Course]='數學',[Score]=[數學] from Class union all
select [Student],[Course]='物理',[Score]=[物理] from Class union all
select [Student],[Course]='英語',[Score]=[英語] from Class union all
select [Student],[Course]='語文',[Score]=[語文] from Class)t
order by [Student],[Course]
go
--2005:
動態:
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([數學],[物理],[英語],[語文]))b
生成格式:
/*
Student Course Score
------- ------- -----------
李四 數學 77
李四 物理 85
李四 英語 65
李四 語文 65
張三 數學 87
張三 物理 90
張三 英語 82
張三 語文 78
(8 行受影響)
*/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-650632/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 報表如何實現行列互換效果?
- 實現二維陣列的行列互換陣列
- web 展現資料時如何實現行列互換Web
- Spark實現行列轉換pivot和unpivotSpark
- oracle和sqlserver互訪(轉)OracleSQLServer
- SQL 如何實現動態的行列轉置SQL
- 使用vue實現行列轉換的一種方法。Vue
- 在報表中錄入資料時如何實現行列轉換
- Restcloud ETl實踐之資料行列轉換RESTCloud
- 元件使用總結:使用 JAXB 實現 XML檔案和java物件互轉元件XMLJava物件
- Unicode編碼和中文互轉(JAVA實現)UnicodeJava
- mysql行列轉換詳解MySql
- Mpvue 小程式轉 Web 實踐總結VueWeb
- 函式計算Python連線SQLServer小結函式PythonSQLServer
- 記錄一個行列轉換
- [轉] 如何實現 React 寫小程式-1React
- TypeScript 實現連結串列反轉TypeScript
- java實現連結串列反轉Java
- Kubernetes實戰總結 - DevOps實現(轉載)dev
- Python+numpy實現矩陣的行列擴充套件Python矩陣套件
- excel列轉行怎麼做 excel如何轉置行列Excel
- Oracle行列轉換及pivot子句的用法Oracle
- Python爬蟲小結(轉)Python爬蟲
- sqlserver 使用總結SQLServer
- 1.31 wlx 魔怔 9 解法互動題小結
- 前端和React Native程式碼互轉總結前端React Native
- C++ string互轉wstring/Unicode互轉ANSI/Unicode互轉UTF8C++Unicode
- React轉小程式現狀React
- 使用python實現一個日期和時間戳互轉的Alfred workflowPython時間戳Alfred
- web3.js 互動 geth 實現轉賬餘額查詢功能WebJS
- 使用redis實現互粉功能Redis
- 小程式實踐小坑小結(一)
- SpringBootDateString互轉Spring Boot
- 如何實現公眾號選單欄跳轉小程式
- 用js實現小寫金額轉大寫的方法JS
- vue路由切換滑動效果 vue頁面跳轉互動 vue實現動畫跳轉Vue路由動畫
- 小結:二叉樹的幾種實現方式二叉樹
- 日誌檔案使用小結(轉)
- [提問交流]這要如何實現跳轉連結