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

服務(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 - Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)

Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)

2020-07-09 16:39MSSQL教程網(wǎng) Sql Server

pivot和unpivot實(shí)現(xiàn)行列轉(zhuǎn)換,這極大的方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù),下面對(duì)這兩個(gè)關(guān)鍵字進(jìn)行分析,結(jié)合實(shí)例講解如何存儲(chǔ)數(shù)據(jù),如何呈現(xiàn)數(shù)據(jù)

從MS Sql Server 2005微軟就推出了pivot和unpivot實(shí)現(xiàn)行列轉(zhuǎn)換,這極大的方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)。今天就對(duì)這兩個(gè)關(guān)鍵字進(jìn)行分析,結(jié)合實(shí)例講解如何存儲(chǔ)數(shù)據(jù),如何呈現(xiàn)數(shù)據(jù)。
例如學(xué)生選課和成績(jī)系統(tǒng)中就有一張表,該表存儲(chǔ)了學(xué)生的課程成績(jī),我們無(wú)法去預(yù)料課程的多少,因此一般表會(huì)設(shè)計(jì)為下面這樣:
圖1
Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù) 
最后一列是課程編號(hào),這樣無(wú)論開(kāi)學(xué)之后還會(huì)不會(huì)增加課程供學(xué)生選擇,都沒(méi)有關(guān)系。那么我們要呈現(xiàn)給用戶(hù)看的報(bào)表一般是這樣的:
圖2
Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù) 
可以看到存儲(chǔ)數(shù)據(jù)的時(shí)候采用的是列式存儲(chǔ),最終呈現(xiàn)的數(shù)據(jù)是行式顯示,如何實(shí)現(xiàn)?下面詳細(xì)分析講解:
創(chuàng)建表語(yǔ)句

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


USE [master]
GO
/****** Object: Table [dbo].[Table_1] Script Date: 08/06/2013 13:55:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Table_1](
[name] [varchar](50) NOT NULL,
[score] [real] NOT NULL,
[subject_id] [int] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO


插入測(cè)試數(shù)據(jù)

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


insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '張三' , 90 , 1 );
insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '張三' , 80 , 2 );
insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '張三' , 70 , 3 );
insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '王五' , 50 , 1 );
insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '王五' , 40 , 2 );
insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '李四' , 60 , 1 );


現(xiàn)在查詢(xún)下Table_1中的數(shù)據(jù)即為圖1中的結(jié)果,現(xiàn)在我們要得到圖2的結(jié)果,那么使用下面的語(yǔ)句:

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


SELECT [name],[1],[2],[3]
FROM [master].[dbo].[Table_1]
pivot
(
sum(score) for subject_id in ([1],[2],[3])
) as pvt
GO


如果本身數(shù)據(jù)庫(kù)表存儲(chǔ)的就是圖2那樣,要變成圖1的方式呈現(xiàn),那就需要用unpivot,可以這樣做:

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


SELECT [name],[subject_id],[score]
FROM
(
SELECT [name],[1],[2],[3]
FROM [master].[dbo].[Table_1]
pivot
(
sum(score) for subject_id in ([1],[2],[3])
) as pvt
) p
unpivot
(
score for subject_id in([1],[2],[3])
) as unpvt


當(dāng)然我還是在Table_1的基礎(chǔ)上先用pvt轉(zhuǎn)為為行式存儲(chǔ)的方式,再用unpivot進(jìn)行列式呈現(xiàn)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人影院入口 | 国产色网| 国内精品久久久久久不卡影院 | a人片| 亚洲香蕉伊在人在线观婷婷 | 免费一级夫妻a | 婚前试爱全集免费观看 | 久久精品中文字幕 | 国产福利兔女郎在线观看 | 国色天香 社区视频 | 操熟美女又肥又嫩的骚屁股 | 99re这里都是精品 | 亚洲欧美日韩特级毛片 | 好硬好大好浪夹得好紧h | 欧美一区二区三区免费不卡 | 成年美女黄网色大观看全 | 欧美高清无砖专区欧美精品 | 出轨同学会免费观看 | 韩国甜性涩爱在线播放 | asianfemdom冷柔女王| 日本在线观看视频网站 | 楚乔传第二部全60集免费观看 | 美女扒下内裤让男人桶的图片 | 亚洲AV无码乱码在线观看浪潮 | 亚洲AV无码乱码国产麻豆穿越 | 67194在线免费观看 | 日本高清免费不卡在线播放 | 99av涩导航 | 日本无遮挡吸乳视频看看 | 日韩在线视精品在亚洲 | 欧美折磨另类系列sm | 国产视频久久 | 欧美一区二区视频 | 青青成人福利国产在线视频 | 亚洲高清视频免费 | 日本艳鉧动漫1~6在线观看 | 欧美一级乱妇老太婆特黄 | 国产精品视频久久 | 好大~好爽~再进去一点 | 国产网站免费观看 | 无耻之徒第十一季在线观看 |