国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah pangkalan data tutorial mysql sqlserver技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot

sqlserver技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot

Jun 07, 2016 pm 03:33 PM
amp Pivot sqlserver teknologi pengendali

例一: 在Sql Server的幫助文檔中,對(duì)Pivot函數(shù)是這樣解釋的: 可以使用 PIVOT 和 UNPIVOT 關(guān)系運(yùn)算符對(duì)表表達(dá)式進(jìn)行操作以獲得另一個(gè)表。PIVOT 通過(guò)將表達(dá)式某一列中的唯一轉(zhuǎn)換為輸出中的多個(gè)列來(lái)轉(zhuǎn)換表表達(dá)式,并在必要時(shí)對(duì)最終輸出中所需的任何其余的列執(zhí)

例一:

在Sql Server的幫助文檔中,對(duì)Pivot函數(shù)是這樣解釋的:
可以使用 PIVOT 和 UNPIVOT 關(guān)系運(yùn)算符對(duì)表值表達(dá)式進(jìn)行操作以獲得另一個(gè)表。PIVOT 通過(guò)將表達(dá)式某一列中的唯一值轉(zhuǎn)換為輸出中的多個(gè)列來(lái)轉(zhuǎn)換表值表達(dá)式,并在必要時(shí)對(duì)最終輸出中所需的任何其余的列值執(zhí)行聚合.

對(duì)第一次使用PIVOT函數(shù)的朋友來(lái)說(shuō),這樣的解釋很難讓大家理解,下面編輯用PIVOT函數(shù)來(lái)實(shí)現(xiàn)一個(gè)行轉(zhuǎn)列的功能,以便讓讀者更容易理解該函數(shù).

注意:PIVOT是Sql Server2005的新函數(shù),2005前行轉(zhuǎn)列請(qǐng)參看本站:
SQLServer中(行列轉(zhuǎn)換)行轉(zhuǎn)列及列轉(zhuǎn)行且加平均值及匯總值

先創(chuàng)建一個(gè)工資表:

Create Table Salary
(
HrName varchar(50),
Monthly varchar(50),
Money money
)

往表中插入數(shù)據(jù):

insert into Salary(HrName,Monthly,[Money])?
select '張三','一月','3000'?
union all
select '張三','二月','3200'?
union all
select '張三','三月','3500'?
union all
select '李四','一月','3800'?
union all
select '李四','二月','4200'?
union all
select '李四','三月','3900'
union all
select '張三','一月','2000'

查看正常的數(shù)據(jù):

select * from Salary

結(jié)果:

HrName? Monthly Money
張三??? 一月??? 3000.00
張三??? 二月??? 3200.00
張三??? 三月??? 3500.00
李四??? 一月??? 3800.00
李四??? 二月??? 4200.00
李四??? 三月??? 3900.00
張三??? 一月??? 2000.00


查看行轉(zhuǎn)列后的數(shù)據(jù):

select HrName as '姓名',[一月],[二月],[三月] from Salary?
pivot(sum([Money]) for Monthly in ([一月],[二月],[三月])) as pvt

結(jié)果:

姓名?? 一月???? 二月???? 三月
李四? 3800.00?? 4200.00? 3900.00
張三? 5000.00?? 3200.00? 500.00


注意:
pivot(sum([Money]) for Monthly in ([一月],[二月],[三月])) 中的sum([Money]),這里必須是聚合函數(shù),比如是min,max等。
in ([一月],[二月],[三月])中的[一月],[二月],[三月]即為Monthly的Value,又為新結(jié)果集的列名.

如果我們將其中的一月改為四月,因?yàn)閿?shù)據(jù)源中沒(méi)有四月的記錄,所以四月查詢出來(lái)應(yīng)該為Null.
測(cè)試:

select HrName as '姓名',[四月],[二月],[三月] from Salary?
pivot(sum([Money]) for Monthly in ([四月],[二月],[三月])) as pvt

結(jié)果:

姓名?? 四月??? 二月???? 三月
李四?? NULL?? 4200.00?? 3900.00
張三?? NULL?? 3200.00?? 3500.00


例二:

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

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

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

還是以學(xué)生成績(jī)表來(lái)舉例:

id姓名 科目 成績(jī)

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

查詢后得出:

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

李四?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?('張三','語(yǔ)文','60');

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

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

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

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

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

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

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

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

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

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

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

go

select?*?from?studentscore

go

sqlserver技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot

?

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

select?[name],

語(yǔ)文=max(case

when?subject='語(yǔ)文'?then?score?else?0

end),

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

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

end),

外語(yǔ)=max(case

when?subject='外語(yǔ)'?then?score?else?0

end)

from?studentscore

group?by?[name]

結(jié)果:

sqlserver技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot

?

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

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

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

pivot

(

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

)?as?pvt

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

sqlserver技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot

?

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

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

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

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

為了好理解我們?cè)賹懸粋€(gè)例子:

--ss這個(gè)子查詢中,多加一列id

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

?

?

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

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

pivot

(

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

)?as?pvt

?

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

sqlserver技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot

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

?

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技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot?

?

SELECT?id,?[name],subject,?score

FROM

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

???FROM?studentscore)?as?ss

UNPIVOT

???(score?FOR?subject?IN

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

)AS?unpvt

結(jié)果:

sqlserver技術(shù)內(nèi)幕<二> 表運(yùn)算符之pivot

?



Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Bagaimana untuk mengimport fail mdf ke dalam sqlserver Bagaimana untuk mengimport fail mdf ke dalam sqlserver Apr 08, 2024 am 11:41 AM

Langkah import adalah seperti berikut: Salin fail MDF ke direktori data SQL Server (biasanya C:\Program Files\Microsoft SQL Server\MSSQL\DATA). Dalam SQL Server Management Studio (SSMS), buka pangkalan data dan pilih Lampirkan. Klik butang Tambah dan pilih fail MDF. Sahkan nama pangkalan data dan klik butang OK.

Bagaimana untuk menyelesaikan masalah yang objek bernama sudah wujud dalam pangkalan data sqlserver Bagaimana untuk menyelesaikan masalah yang objek bernama sudah wujud dalam pangkalan data sqlserver Apr 05, 2024 pm 09:42 PM

Untuk objek dengan nama yang sama yang telah wujud dalam pangkalan data SQL Server, langkah berikut perlu diambil: Sahkan jenis objek (jadual, paparan, prosedur tersimpan). IF NOT EXISTS boleh digunakan untuk melangkau penciptaan jika objek kosong. Jika objek mempunyai data, gunakan nama lain atau ubah suai struktur. Gunakan DROP untuk memadam objek sedia ada (berhati-hati, sandaran disyorkan). Semak perubahan skema untuk memastikan tiada rujukan kepada objek yang dipadam atau dinamakan semula.

Apakah yang perlu saya lakukan jika sqlserver tidak boleh dipadam dan tidak boleh dipasang semula? Apakah yang perlu saya lakukan jika sqlserver tidak boleh dipadam dan tidak boleh dipasang semula? Apr 05, 2024 pm 11:30 PM

Masalah bahawa SQL Server tidak boleh dipasang semula kerana pemadaman yang tidak lengkap boleh diselesaikan dengan mengikuti langkah berikut: padam fail dan entri pendaftaran secara manual menggunakan alat pemasangan dan nyahpasang oleh pihak ketiga; komputer; pasang semula SQL Server.

Bagaimana untuk menyemak nombor port sqlserver Bagaimana untuk menyemak nombor port sqlserver Apr 05, 2024 pm 09:57 PM

Untuk melihat nombor port SQL Server: Buka SSMS dan sambung ke pelayan. Cari nama pelayan dalam Object Explorer, klik kanan padanya dan pilih Properties. Dalam tab Sambungan, lihat medan Port TCP.

Bagaimana untuk memulihkan pangkalan data yang dipadam secara tidak sengaja dalam sqlserver Bagaimana untuk memulihkan pangkalan data yang dipadam secara tidak sengaja dalam sqlserver Apr 05, 2024 pm 10:39 PM

Jika anda secara tidak sengaja memadamkan pangkalan data SQL Server, anda boleh mengambil langkah-langkah berikut untuk memulihkan: hentikan aktiviti pangkalan data periksa log pangkalan data: pulihkan daripada sandaran menggunakan DBCC; alatan parti. Sila sandarkan pangkalan data anda dengan kerap dan dayakan pengelogan transaksi untuk mengelakkan kehilangan data.

Bagaimana untuk menukar pemasangan bahasa Inggeris sqlserver kepada bahasa Cina Bagaimana untuk menukar pemasangan bahasa Inggeris sqlserver kepada bahasa Cina Apr 05, 2024 pm 10:21 PM

Pemasangan Bahasa Inggeris Pelayan SQL boleh ditukar kepada bahasa Cina dengan mengikuti langkah berikut: muat turun pek bahasa yang sepadan dengan memasang pek bahasa;

Apa yang perlu dilakukan jika perkhidmatan sqlserver tidak dapat dimulakan Apa yang perlu dilakukan jika perkhidmatan sqlserver tidak dapat dimulakan Apr 05, 2024 pm 10:00 PM

Apabila perkhidmatan SQL Server gagal dimulakan, berikut ialah beberapa langkah untuk diselesaikan: Semak log ralat untuk menentukan punca. Pastikan akaun perkhidmatan mempunyai kebenaran untuk memulakan perkhidmatan. Semak sama ada perkhidmatan pergantungan sedang berjalan. Lumpuhkan perisian antivirus. Membaiki pemasangan SQL Server. Jika pembaikan tidak berjaya, pasang semula SQL Server.

Di manakah pangkalan data sqlserver? Di manakah pangkalan data sqlserver? Apr 05, 2024 pm 08:21 PM

Fail pangkalan data SQL Server biasanya disimpan di lokasi lalai berikut: Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data Lokasi fail pangkalan data boleh disesuaikan dengan mengubah suai laluan fail pangkalan data tetapan.

See all articles