一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Sql Server - 玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換

玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換

2020-07-09 17:27mssql教程網(wǎng) Sql Server

雖然開(kāi)發(fā)過(guò)程中沒(méi)用過(guò)行列轉(zhuǎn)換,但是聽(tīng)說(shuō)面試時(shí)常常會(huì)遇到這個(gè)問(wèn)題,以前在網(wǎng)上也看到過(guò)大神的例子,今天自己仔細(xì)的玩了下,希望和大家分享一下了

注意:列轉(zhuǎn)行的方法可能是我獨(dú)創(chuàng)的了,呵呵,因?yàn)樵诰W(wǎng)上找不到哦,全部是我自己寫(xiě)的,用到了系統(tǒng)的SysColumns

(一)行轉(zhuǎn)列的方法

先說(shuō)說(shuō)行轉(zhuǎn)列的方法,這個(gè)就比較好想了,利用拼sql和case when解決即可

實(shí)現(xiàn)目的

玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換

 

1:建立測(cè)試用的數(shù)據(jù)庫(kù)

復(fù)制代碼 代碼如下:

CREATE TABLE RowTest(
    [Name] [nvarchar](10) NULL,--名稱(chēng)
    [Course] [nvarchar](10) NULL,--課程名稱(chēng)
    [Record] [int] NULL--課程的分?jǐn)?shù)
)


2:加入測(cè)試用的數(shù)據(jù)庫(kù)(先加入整齊的數(shù)據(jù))

 

 

復(fù)制代碼 代碼如下:


insert into RowTest values ('張三','語(yǔ)文','91')
insert into RowTest values ('張三','數(shù)學(xué)','92')
insert into RowTest values ('張三','英語(yǔ)','93')
insert into RowTest values ('張三','生物','94')
insert into RowTest values ('張三','物理','95')
insert into RowTest values ('張三','化學(xué)','96')

 

insert into RowTest values ('李四','語(yǔ)文','81')
insert into RowTest values ('李四','數(shù)學(xué)','82')
insert into RowTest values ('李四','英語(yǔ)','83')
insert into RowTest values ('李四','生物','84')
insert into RowTest values ('李四','物理','85')
insert into RowTest values ('李四','化學(xué)','86')

insert into RowTest values ('小生','語(yǔ)文','71')
insert into RowTest values ('小生','數(shù)學(xué)','72')
insert into RowTest values ('小生','英語(yǔ)','73')
insert into RowTest values ('小生','生物','74')
insert into RowTest values ('小生','物理','75')
insert into RowTest values ('小生','化學(xué)','76')

 

3:設(shè)計(jì)想法

  行轉(zhuǎn)列的原理就是把行的類(lèi)別找出來(lái)當(dāng)做查詢(xún)的字段,利用case when 把當(dāng)前的分?jǐn)?shù)加到當(dāng)前的字段上去,最后用group by 把數(shù)據(jù)整合在一起

4:通用方法

 

復(fù)制代碼 代碼如下:


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)

 

說(shuō)明: 把所有的課程名稱(chēng)取出來(lái)作為列(查詢(xún)表TCourse)

        用case when 的方法把sql 拼出來(lái)

5:課外試驗(yàn)

(1)加入數(shù)據(jù)

 

復(fù)制代碼 代碼如下:

insert into dbo.RowTest values ('小生','生物','110')

 

去除max 方法會(huì)報(bào)錯(cuò),因?yàn)橐粭l可能對(duì)應(yīng)多行數(shù)據(jù)

(2)加入數(shù)據(jù)

 

復(fù)制代碼 代碼如下:

insert into dbo.RowTest values ('小生','計(jì)算機(jī)','110')

 

數(shù)據(jù)會(huì)多出一列,但是其他人無(wú)此課程就會(huì)為0

至此,數(shù)據(jù)行轉(zhuǎn)列ok

(二)列轉(zhuǎn)行的新方法開(kāi)始了

實(shí)現(xiàn)目的

玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換

1:實(shí)現(xiàn)原理

在網(wǎng)上看了別人的做法,基本都是用union all 來(lái)一個(gè)個(gè)轉(zhuǎn)換的,我覺(jué)得不太好用。

首先我想到了要把所有的列名取出來(lái),就在網(wǎng)上查了下獲取表的所有列名

 然后我可以把主表和列名形成的表串起來(lái),這樣就可以形成需要的列數(shù),然后根據(jù)判斷取值就完成了了,呵呵

2:建立表格

復(fù)制代碼 代碼如下:

create table CoulumTest
(
 Name nvarchar(10),
 語(yǔ)文  int,
 數(shù)學(xué) int,
 英語(yǔ) int

)


3:加入數(shù)據(jù)

復(fù)制代碼 代碼如下:

insert into CoulumTest values(N'張三',90,91,92)
insert into CoulumTest values(N'李四',80,81,82)


4:經(jīng)典的地方來(lái)了

復(fù)制代碼 代碼如下:

select CT.Name,Col.name 課程,
(case when Col.name=N'語(yǔ)文' then CT.語(yǔ)文  when Col.name=N'數(shù)學(xué)' then CT.數(shù)學(xué)
 when Col.name=N'英語(yǔ)' then CT.英語(yǔ) end ) as 分?jǐn)?shù) from CoulumTest CT
left join (select name from SysColumns  Where id=Object_Id('CoulumTest')) Col on Col.name<>'Name'


你沒(méi)看錯(cuò),一句話(huà)搞定,但是有個(gè)問(wèn)題迷惑了我,我覺(jué)得還不夠簡(jiǎn)化,如果可以把case when 都不用了就更好了,請(qǐng)大神們指點(diǎn)小弟一下了。怎么根據(jù)

 

Col的name 直接取得分?jǐn)?shù)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 肉文小说 | 白丝出水 | 喷出奶汁了h | xxxxx大片在线观看 | 精品视频免费在线观看 | 国产日韩精品一区二区 | 丝瓜污污 | 午夜爽喷水无码成人18禁三级 | 亚洲欧美一级夜夜爽w | 天堂网站天堂小说 | 特黄特级高清免费视频毛片 | 国产成人福利美女观看视频 | 国产99久久精品 | 好大好深好涨好烫还要 | 亚洲国产精品综合久久一线 | 日本小视频免费 | 91国内在线国内在线播放 | 三级伦理影院 | 婷婷精品 | 国产成人h综合亚洲欧美在线 | 婷婷精品 | 美女又爽又黄免费 | 色视频亚洲 | 国产精品亚洲片在线不卡 | 久久三级视频 | 色人阁图片| 国产91精品久久久久久久 | 亚洲性视频在线观看 | 9966久久精品免费看国产 | 国产精品视频1区 | 91久久精品国产一区二区 | 国产一卡2卡3卡四卡国色天香 | 免费一级毛片在线播放 | 国产精品美女久久久久 | 免费在线电视 | 极品美女aⅴ高清在线观看 极品ts赵恩静和直男激战啪啪 | 亚洲黄色成人 | 日本高清在线精品一区二区三区 | 国产伊人久久 | 91制片厂制作果冻传媒123 | 色444|