欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

SQLServer 2005 實(shí)現(xiàn)交叉表格報(bào)表的利器 PIVOT

系統(tǒng) 1900 0

在SQLServer 2000環(huán)境中,如果要實(shí)現(xiàn)交叉表格報(bào)表,主要是靠一系列復(fù)雜的 SELECT...CASE 語句.

其實(shí)現(xiàn)過程請參閱這里 T-SQL 交叉報(bào)表(行列互換) 交叉查詢 旋轉(zhuǎn)查詢

在SQLServer 2005中我們可以使用PIVOT關(guān)系運(yùn)算符來實(shí)現(xiàn)行列轉(zhuǎn)換.

還是以學(xué)生成績表來舉例:

id姓名 科目 成績

1張三語文60
2張三數(shù)學(xué)65
3張三外語70
4李四語文80
5李四數(shù)學(xué)90
6李四外語85
7王五語文70
8王五數(shù)學(xué)71
9王五外語75
10趙六語文64
11趙六數(shù)學(xué)67
12趙六外語76

查詢后得出:

姓名語文數(shù)學(xué)外語

李四80 90 85
王五70 71 75
張三60 65 70
趙六64 67 76

-- 準(zhǔn)備數(shù)據(jù) :

select * from sysobjects where [xtype] = 'u'

go

if exists( select id from sysobjects where name = 'studentscore' )

drop table studentscore -- 刪除與實(shí)驗(yàn)沖突的表

go

create table studentscore -- 創(chuàng)建實(shí)驗(yàn)表

(

[id] int identity ( 1 , 1 ),

[name] nvarchar ( 20 ) not null,

subject nvarchar ( 20 ) not null,

score int not null

)

go

select * from studentscore

go

-- 添加實(shí)驗(yàn)數(shù)據(jù)

insert studentscore values ( ' 張三 ' , ' 語文 ' , '60' );

insert studentscore values ( ' 張三 ' , ' 數(shù)學(xué) ' , '65' );

insert studentscore values ( ' 張三 ' , ' 外語 ' , '70' );

insert studentscore values ( ' 李四 ' , ' 語文 ' , '80' );

insert studentscore values ( ' 李四 ' , ' 數(shù)學(xué) ' , '90' );

insert studentscore values ( ' 李四 ' , ' 外語 ' , '85' );

insert studentscore values ( ' 王五 ' , ' 語文 ' , '70' );

insert studentscore values ( ' 王五 ' , ' 數(shù)學(xué) ' , '71' );

insert studentscore values ( ' 王五 ' , ' 外語 ' , '75' );

insert studentscore values ( ' 趙六 ' , ' 語文 ' , '64' );

insert studentscore values ( ' 趙六 ' , ' 數(shù)學(xué) ' , '67' );

insert studentscore values ( ' 趙六 ' , ' 外語 ' , '76' );

go

select * from studentscore

go

添加數(shù)據(jù)后的結(jié)果

使用 SELECT...CASE 語句實(shí)現(xiàn)代碼如下

select [name] ,

語文 = max ( case

when subject = ' 語文 ' then score else 0

end ),

數(shù)學(xué) = max ( case

when subject = ' 數(shù)學(xué) ' then score else 0

end ),

外語 = max ( case

when subject = ' 外語 ' then score else 0

end )

from studentscore

group by [name]

結(jié)果:

下面我們使用PIVOT關(guān)系運(yùn)算符來實(shí)現(xiàn)行列轉(zhuǎn)換

select [name] , [ 語文 ] as ' 語文 ' , [ 數(shù)學(xué) ] as ' 數(shù)學(xué) ' , [ 外語 ] as ' 外語 '

from ( select score , subject , [name] from studentscore ) as ss

pivot

(

sum ( score ) for subject in( [ 語文 ] , [ 數(shù)學(xué) ] , [ 外語 ] )

) as pvt

結(jié)果:用較少的代碼完成了交叉表格報(bào)表

============================

對于這種方法要注意的一點(diǎn)是,我們使用sum()聚合函數(shù),表面上沒有指定按什么方式分組,但是自動按照name列分組了.

怎么做到的呢?原來 pivot關(guān)系運(yùn)算符會根據(jù)前面的對象中的列來自行判斷,在這個例子中 pivot前面的對象是ss,是個子查詢,這個子查詢中只有三列,score , subject [name],但是 pivot運(yùn)算符內(nèi)部使用了score subject這兩列,那么肯定是對[name]分組.

所以我們得出, pivot運(yùn)算符的分組規(guī)則是,跟隨對象中的那些不在 pivot運(yùn)算符內(nèi)部的列:

為了好理解我們再寫一個例子:

-- ss 這個子查詢中 , 多加一列 id

-- 那么 pivot 應(yīng)該按照 name id 進(jìn)行分組

select [name] , [ 語文 ] as ' 語文 ' , [ 數(shù)學(xué) ] as ' 數(shù)學(xué) ' , [ 外語 ] as ' 外語 '

from ( select score , subject , [name],id from studentscore ) as ss

pivot

(

sum ( score ) for subject in( [ 語文 ] , [ 數(shù)學(xué) ] , [ 外語 ] )

) as pvt

結(jié)果:驗(yàn)證了我們的設(shè)想

UNPIVOT關(guān)系運(yùn)算符從字面上來看,就知道它的用途正好和PIVOT相反,下面舉例說明:

if exists( select id from sysobjects where name = 'studentscore' )

drop table studentscore -- 刪除與實(shí)驗(yàn)沖突的表

go

create table studentscore -- 創(chuàng)建實(shí)驗(yàn)表

(

[id] int identity ( 1 , 1 ),

[name] nvarchar ( 20 ) not null,

yuwen int not null,

shuxue int not null,

waiyu int not null

)

go

select * from studentscore

go

-- 添加實(shí)驗(yàn)數(shù)據(jù)

insert studentscore values ( ' 張三 ' , '60' , '65' , '70' );

insert studentscore values ( ' 李四 ' , '80' , '90' , '86' );

insert studentscore values ( ' 王五 ' , '70' , '71' , '75' );

insert studentscore values ( ' 趙六 ' , '64' , '67' , '76' );

go

select * from studentscore

go

結(jié)果:

SQLServer 2005 實(shí)現(xiàn)交叉表格報(bào)表的利器 PIVOT 和 UNPIVOT 關(guān)系運(yùn)算符

SELECT id , [name] , subject , score

FROM

( SELECT id , [name] , 語文 = yuwen , 數(shù)學(xué) = shuxue , 外語 = waiyu

FROM studentscore ) as ss

UNPIVOT

( score FOR subject IN

( 語文 , 數(shù)學(xué) , 外語 )

) AS unpvt

結(jié)果:

SQLServer 2005 實(shí)現(xiàn)交叉表格報(bào)表的利器 PIVOT 和 UNPIVOT 關(guān)系運(yùn)算符

SQLServer 2005 實(shí)現(xiàn)交叉表格報(bào)表的利器 PIVOT 和 UNPIVOT 關(guān)系運(yùn)算符


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久久久久久午夜 | JLZZJLZZ日本人护士水好多 | 999毛片免费观看 | 亚洲视频在线一区二区 | 免费国产成人高清视频网站 | 国产精品婷婷久久久久 | 中文字幕 在线观看 | 色免费看 | 国产无线乱码一区二三区 | 精品亚洲国产成av人片传媒 | 午夜视频免费 成人 | 亚洲香蕉久久一区二区三区四区 | 久草视频在线播放 | 亚洲性后网 | 欧美成人免费在线视频 | 国产欧美精品午夜在线播放 | 91视频观看 | 精品一区二区三区免费毛片 | 亚洲欧洲一区二区 | 国产亚洲精品久久久久久国 | 日本久久精品视频 | 日韩成人精品在线 | 久久久久国产成人精品亚洲午夜 | 亚洲欧美第一页 | 亚洲欧美在线视频免费 | 六月婷婷综合激情 | 国产精品国产精品国产专区不卡 | 91亚洲国产成人久久精品网站 | 国产激情在线观看 | 久久99精品久久久久久国产越南 | 99视频在线观看精品 | 日韩日b视频 | 图片区乱熟图片区小说 | 色噜噜狠狠狠狠色综合久不 | 亚洲精品在线看 | 亚洲日本在线观看视频 | 日本不卡中文字幕一区二区 | 日本欧美久久久久免费播放网 | 男女性刺激爽爽免费视频 | 亚洲五月综合网色九月色 | 在线观看国产免费高清不卡 |