激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

香港云服务器
服務器之家 - 數據庫 - Sql Server - 玩轉-SQL2005數據庫行列轉換

玩轉-SQL2005數據庫行列轉換

2020-07-09 17:27mssql教程網 Sql Server

雖然開發過程中沒用過行列轉換,但是聽說面試時常常會遇到這個問題,以前在網上也看到過大神的例子,今天自己仔細的玩了下,希望和大家分享一下了

注意:列轉行的方法可能是我獨創的了,呵呵,因為在網上找不到哦,全部是我自己寫的,用到了系統的SysColumns

(一)行轉列的方法

先說說行轉列的方法,這個就比較好想了,利用拼sql和case when解決即可

實現目的

玩轉-SQL2005數據庫行列轉換

 

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

(二)列轉行的新方法開始了

實現目的

玩轉-SQL2005數據庫行列轉換

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

延伸 · 閱讀

精彩推薦
616
主站蜘蛛池模板: 久久超 | 午夜视频免费在线观看 | 天天看天天摸天天操 | 中文字幕在线资源 | 久久亚洲精品久久国产一区二区 | 99re热视频这里只精品 | 国产成年人在线观看 | 美女在线观看视频一区二区 | 一级黄色毛片a | 国产精品视频在线观看免费 | 2017亚洲男人天堂 | 久久2019中文字幕 | 久久久久久久黄色片 | 亚洲国产资源 | 免费一级在线 | 国产91小视频在线观看 | h色视频在线观看 | 羞羞羞网站 | 麻豆视频在线播放 | 99视频有精品视频高清 | 一区二区三区在线播放视频 | 免费毛片小视频 | 成年片在线观看 | 黄色片网站在线看 | 亚洲一二区视频 | 一级一级一级一级毛片 | 国产在线一级片 | 性片网站 | 韩国十九禁高潮床戏在线观看 | 国产羞羞视频 | 亚洲aⅴ免费在线观看 | 香蕉视频破解 | 久久久久久久久淑女av国产精品 | 在线观看国产免费视频 | 精品国产一区二区三区四 | 国产日韩大片 | 毛片大全| 亚洲一区二区三区精品在线观看 | 国产99久久久久 | 黄色毛片免费看 | 欧美特黄一级视频 |