玩轉 SQL2005資料庫行列轉換

2022-09-24 17:42:23 字數 3051 閱讀 4238

注意:列轉行的方法可能是我獨創的了,呵呵,因為在網上找不到哦,全部是我自己寫的,用到了系統的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 in程式設計客棧to rowtest values ('李四','物理','85')

insert into rowtest values ('李四','化學','86')

insert into rowtest valuwww.cppcns.comes ('小生','語文','71')

insert into rowtest values ('小生','數學','72')

insert into r 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 直接取得分數

本文標題: 玩轉-sql2005資料庫行列轉換

本文位址:

SQL2005資料庫行列轉換

注意 列轉行的方法可能是我獨創的了,呵呵,因為在網上找不到哦,全部是我自己寫的,用到了系統的syscolumns 一 行轉列的方法 先說說行轉列的方法,這個就比較好想了,利用拼sql和case when解決即可 實現目的 name nvarchar 10 null,名稱 course nvarcha...

SQL2005 資料庫置疑

很多朋友在2005 中遇到置疑 丟失日誌時按照網上常見的 mssql2000 修復方法來做,結果發現行不通,甚至連一步都做不下去。其實,在 mssql2005 在處理置疑問題的思 路與mssql2000 是一致的,但具體到一些語句上 mssql2005 有了很大的變動。我們以 乙個被誤刪日誌檔案的資...

sql2005資料庫還原

需要注意的問題 a.兩類特殊的資料型別 日期和時間型別的資料儲存方式和可用值範圍 相關的計算 比較 顯示 換為指定格式的字串 都比較複雜,還涉及一組日期時間函式。參看datetime型別分析一帖。字串型別涉及到字元編碼和排序規則,比較操作還包含like匹配 未來還可能會支援正規表示式匹配 非常需要注...