玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫行列轉(zhuǎn)換
注意:列轉(zhuǎn)行的方法可能是我獨創(chuàng)的了,呵呵,因為在網(wǎng)上找不到哦,全部是我自己寫的,用到了系統(tǒng)的SysColumns
(一)行轉(zhuǎn)列的方法
先說說行轉(zhuǎn)列的方法,這個就比較好想了,利用拼sql和case when解決即可
實現(xiàn)目的
1:建立測試用的數(shù)據(jù)庫
CREATE TABLE RowTest(
[Name] [nvarchar](10) NULL,--名稱
[Course] [nvarchar](10) NULL,--課程名稱
[Record] [int] NULL--課程的分?jǐn)?shù)
)
2:加入測試用的數(shù)據(jù)庫(先加入整齊的數(shù)據(jù))
insert into RowTest values ('張三','語文','91')
insert into RowTest values ('張三','數(shù)學(xué)','92')
insert into RowTest values ('張三','英語','93')
insert into RowTest values ('張三','生物','94')
insert into RowTest values ('張三','物理','95')
insert into RowTest values ('張三','化學(xué)','96')
insert into RowTest values ('李四','語文','81')
insert into RowTest values ('李四','數(shù)學(xué)','82')
insert into RowTest values ('李四','英語','83')
insert into RowTest values ('李四','生物','84')
insert into RowTest values ('李四','物理','85')
insert into RowTest values ('李四','化學(xué)','86')
insert into RowTest values ('小生','語文','71')
insert into RowTest values ('小生','數(shù)學(xué)','72')
insert into RowTest values ('小生','英語','73')
insert into RowTest values ('小生','生物','74')
insert into RowTest values ('小生','物理','75')
insert into RowTest values ('小生','化學(xué)','76')
3:設(shè)計想法
行轉(zhuǎn)列的原理就是把行的類別找出來當(dāng)做查詢的字段,利用case when 把當(dāng)前的分?jǐn)?shù)加到當(dāng)前的字段上去,最后用group by 把數(shù)據(jù)整合在一起
4:通用方法
declare @sql nvarchar(max)
set @sql='select Name'
select @sql=@sql+','+'isnull(max( case when Course='''+TCourse.Course+''' then Record end ),0)'+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 的方法把sql 拼出來
5:課外試驗
(1)加入數(shù)據(jù)
insert into dbo.RowTest values ('小生','生物','110')
去除max 方法會報錯,因為一條可能對應(yīng)多行數(shù)據(jù)
(2)加入數(shù)據(jù)
insert into dbo.RowTest values ('小生','計算機(jī)','110')
數(shù)據(jù)會多出一列,但是其他人無此課程就會為0
至此,數(shù)據(jù)行轉(zhuǎn)列ok
(二)列轉(zhuǎn)行的新方法開始了
實現(xiàn)目的

1:實現(xiàn)原理
在網(wǎng)上看了別人的做法,基本都是用union all 來一個個轉(zhuǎn)換的,我覺得不太好用。
首先我想到了要把所有的列名取出來,就在網(wǎng)上查了下獲取表的所有列名
然后我可以把主表和列名形成的表串起來,這樣就可以形成需要的列數(shù),然后根據(jù)判斷取值就完成了了,呵呵
2:建立表格
create table CoulumTest
(
Name nvarchar(10),
語文 int,
數(shù)學(xué) int,
英語 int
)
3:加入數(shù)據(jù)
insert into CoulumTest values(N'張三',90,91,92)
insert into CoulumTest values(N'李四',80,81,82)
4:經(jīng)典的地方來了
select CT.Name,Col.name 課程,
(case when Col.name=N'語文' then CT.語文 when Col.name=N'數(shù)學(xué)' then CT.數(shù)學(xué)
when Col.name=N'英語' then CT.英語 end ) as 分?jǐn)?shù) from CoulumTest CT
left join (select name from SysColumns Where id=Object_Id('CoulumTest')) Col on Col.name<>'Name'
你沒看錯,一句話搞定,但是有個問題迷惑了我,我覺得還不夠簡化,如果可以把case when 都不用了就更好了,請大神們指點小弟一下了。怎么根據(jù)
Col的name 直接取得分?jǐn)?shù)
- sql 普通行列轉(zhuǎn)換
- 一個簡單的SQL 行列轉(zhuǎn)換語句
- sqlserver2005 行列轉(zhuǎn)換實現(xiàn)方法
- Sql實現(xiàn)行列轉(zhuǎn)換方便了我們存儲數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
- 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
- PostgreSQL實現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
- sql server通過pivot對數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
- SQL Server 使用 Pivot 和 UnPivot 實現(xiàn)行列轉(zhuǎn)換的問題小結(jié)
- SQL Server使用PIVOT與unPIVOT實現(xiàn)行列轉(zhuǎn)換
- MySQL實現(xiàn)行列轉(zhuǎn)換
- SQL行列轉(zhuǎn)換超詳細(xì)四種方法詳解
- SQL Server行列轉(zhuǎn)換的實現(xiàn)示例
- SQLServer使用 PIVOT 和 UNPIVOT行列轉(zhuǎn)換
相關(guān)文章
sql2005數(shù)據(jù)導(dǎo)出方法(使用存儲過程導(dǎo)出數(shù)據(jù)為腳本)
在數(shù)據(jù)庫中使用下面的腳本創(chuàng)建存儲過程,然后執(zhí)行存儲過程,參數(shù)為表名,就可以把表的數(shù)據(jù)輸出為SQL腳本2014-01-01
sql2005 附加數(shù)據(jù)庫出錯(錯誤號:5123)解決方法
無法為此請求檢索數(shù)據(jù)。(Microsoft.SqlServer.SmoEnum)其他信息執(zhí)行Transact-Sql語句或批處理時發(fā)生了異常,Microsoft.SqlServer.ConnectionInfo)嘗試打開或創(chuàng)建物理文件d:\Data\***.mdf時,Create file遇到操作系統(tǒng)錯誤5(拒絕訪問。2012-07-07
SQLServer 2005系統(tǒng)配置要求官方說明
SQLServer 2005系統(tǒng)配置要求官方說明,需要安裝sql2005的朋友需要了解下。2009-08-08
SQL 2005使用專用管理員連接(DAC)的技巧及修改系統(tǒng)表的方法
SQL Server 2005 為管理員提供了一種特殊的診斷連接,以供在無法與服務(wù)器建立標(biāo)準(zhǔn)連接時使用。2011-07-07
SQL Server中TRUNCATE事務(wù)回滾操作方法
本文介紹在事務(wù)中回滾TRUNCATE操作的方法,并演示了操作的結(jié)果,是可以對TRUNCATE進(jìn)行回滾操作的。2016-05-05
sqlserver中獲取當(dāng)前日期的午夜的時間值的實現(xiàn)方法
MS SQLServer,如何獲取當(dāng)前系統(tǒng)日期的午夜的時間值的方法,需要的朋友可以參考下。2011-09-09
通過創(chuàng)建SQLServer 2005到 Oracle10g 的鏈接服務(wù)器實現(xiàn)異構(gòu)數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)換方案
通過創(chuàng)建SQL Server 2005到 Oracle10g 的鏈接服務(wù)器實現(xiàn)異構(gòu)數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)換方案,需要的朋友可以參考下。2011-06-06
SQL Server 2005與sql 2000之間的數(shù)據(jù)轉(zhuǎn)換方法
這篇文章主要介紹了SQL Server 2005與sql 2000之間的數(shù)據(jù)轉(zhuǎn)換方法,需要的朋友可以參考下2014-08-08

