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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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


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

 

 

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


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è)計(jì)想法

  行轉(zhuǎn)列的原理就是把行的類別找出來當(dāng)做查詢的字段,利用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)

 

說明: 把所有的課程名稱取出來作為列(查詢表TCourse)

        用case when 的方法把sql 拼出來

5:課外試驗(yàn)

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

 

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

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

 

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

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

 

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

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

 

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

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

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

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

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

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

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

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

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

2:建立表格

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

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

)


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

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

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


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

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

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'


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

 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.麻豆| 四虎精品在线视频 | 好紧好爽再叫浪一点点潘金莲 | 九九影院午夜理论片无码 | 97热在线 | 天堂成人在线视频 | 欧美国产影院 | 国产精品国产三级国产专区不 | 性关系免费视频 | jk制服白丝超短裙流白浆 | 无限国产资源 | 久久re视频这里精品一本到99 | 色人阁小说 | 国产成人在线免费视频 | 四虎免费入口 | 趴好撅高打屁股sp调教h | 15同性同志18 | 爽爽影院免费观看 | bedfriend泰剧全集免费观看 | 亚洲国产精品91 | 黄篇网站在线观看 | 国产一区二区三区高清 | 日韩aⅴ在线观看 | 亚洲第成色999久久网站 | 日韩国产欧美成人一区二区影院 | a看片| 俄罗斯freeoo性另类 | 粗了大了 整进去好爽视频 刺激一区仑乱 | 色老板在线观看 | 国产福利在线观看91精品 | 久久精视频 | beeg最新 | 亚洲国产99在线精品一区69堂 | 99精品在免费线视频 | 免费aⅴ片| 美女流白浆 | 男女全黄h全肉细节文 | ak福利午夜在线观看 | 滑进了柔佳火热紧夹的 | 91在线 一区 二区三区 | 亚洲精品一 |