国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > SQL Server > 正文

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

2024-08-31 01:01:04
字體:
供稿:網(wǎng)友
從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ī),我們無法去預(yù)料課程的多少,因此一般表會(huì)設(shè)計(jì)為下面這樣:
圖1

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

 
最后一列是課程編號(hào),這樣無論開學(xué)之后還會(huì)不會(huì)增加課程供學(xué)生選擇,都沒有關(guān)系。那么我們要呈現(xiàn)給用戶看的報(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)在查詢下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)。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沙湾县| 新乐市| 永定县| 乐业县| 桐庐县| 宜宾市| 西青区| 读书| 太仓市| 松潘县| 新兴县| 崇明县| 施秉县| 宁城县| 虎林市| 镇远县| 三门峡市| 江孜县| 杂多县| 巴青县| 平南县| 中阳县| 简阳市| 舒城县| 金塔县| 宜昌市| 安陆市| 务川| 湖州市| 抚宁县| 怀仁县| 略阳县| 安新县| 临澧县| 永仁县| 田阳县| 收藏| 宜兴市| 明溪县| 河北省| 泰兴市|