雖然開發過程中沒用過行列轉換,但是聽說面試時常常會遇到這個問題,以前在網上也看到過大神的例子,今天自己仔細的玩了下,希望和大家分享一下了。
注意:列轉行的方法可能是我獨創的了,呵呵,因為在網上找不到哦,全部是我自己寫的,用到了系統的SysColumns
(一)行轉列的方法
先說說行轉列的方法,這個就比較好想了,利用拼sql和case when解決即可
實現目的
1:建立測試用的數據庫
CREATE TABLE RowTest( [Name] [nvarchar]( 10 ) NULL,-- 名稱 [Course] [nvarchar]( 10 ) NULL,-- 課程名稱 [Record] [ int ] NULL-- 課程的分數 )
2:加入測試用的數據庫(先加入整齊的數據)

insert into RowTest values ( ' 張三 ' , ' 語文 ' , ' 91 ' ) insert into RowTest values ( ' 張三 ' , ' 數學 ' , ' 92 ' ) insert into RowTest values ( ' 張三 ' , ' 英語 ' , ' 93 ' ) insert into RowTest values ( ' 張三 ' , ' 生物 ' , ' 94 ' ) insert into RowTest values ( ' 張三 ' , ' 物理 ' , ' 95 ' ) insert into RowTest values ( ' 張三 ' , ' 化學 ' , ' 96 ' ) insert into RowTest values ( ' 李四 ' , ' 語文 ' , ' 81 ' ) insert into RowTest values ( ' 李四 ' , ' 數學 ' , ' 82 ' ) insert into RowTest values ( ' 李四 ' , ' 英語 ' , ' 83 ' ) insert into RowTest values ( ' 李四 ' , ' 生物 ' , ' 84 ' ) insert into RowTest values ( ' 李四 ' , ' 物理 ' , ' 85 ' ) insert into RowTest values ( ' 李四 ' , ' 化學 ' , ' 86 ' ) insert into RowTest values ( ' 小生 ' , ' 語文 ' , ' 71 ' ) insert into RowTest values ( ' 小生 ' , ' 數學 ' , ' 72 ' ) insert into RowTest values ( ' 小生 ' , ' 英語 ' , ' 73 ' ) insert into RowTest values ( ' 小生 ' , ' 生物 ' , ' 74 ' ) insert into RowTest values ( ' 小生 ' , ' 物理 ' , ' 75 ' ) insert into RowTest values ( ' 小生 ' , ' 化學 ' , ' 76 ' )
3:設計想法
? 行轉列的原理就是把行的類別找出來當做查詢的字段,利用case when 把當前的分數加到當前的字段上去,最后用group by 把數據整合在一起
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)加入數據
insert into dbo.RowTest values ( ' 小生 ' , ' 生物 ' , ' 110 ' )
去除max 方法會報錯,因為一條可能對應多行數據
(2)加入數據
insert into dbo.RowTest values ( ' 小生 ' , ' 計算機 ' , ' 110 ' )
數據會多出一列,但是其他人無此課程就會為0
至此,數據行轉列ok?
(二)列轉行的新方法開始了
實現目的
?
1:實現原理
在網上看了別人的做法,基本都是用union all 來一個個轉換的,我覺得不太好用。
首先我想到了要把所有的列名取出來,就在網上查了下獲取表的所有列名
?然后我可以把主表和列名形成的表串起來,這樣就可以形成需要的列數,然后根據判斷取值就完成了了,呵呵
2:建立表格

create table CoulumTest ( Name nvarchar ( 10 ), 語文 int , 數學 int , 英語 int )
3:加入數據
insert into CoulumTest values(N ' 張三 ' , 90 , 91 , 92 ) insert into CoulumTest values(N ' 李四 ' , 80 , 81 , 82 )
4:經典的地方來了

select CT.Name,Col.name 課程, ( case when Col.name = N ' 語文 ' then CT.語文 when Col.name = N ' 數學 ' then CT.數學 when Col.name = N ' 英語 ' then CT.英語 end ) as 分數 from CoulumTest CT left join ( select name from SysColumns Where id = Object_Id ( ' CoulumTest ' )) Col on Col.name <> ' Name '
你沒看錯,一句話搞定,但是有個問題迷惑了我,我覺得還不夠簡化,如果可以把case when 都不用了就更好了,請大神們指點小弟一下了。怎么根據
Col的name 直接取得分數
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
