Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
更新時(shí)間:2013年08月15日 15:48:58 作者:
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
最后一列是課程編號(hào),這樣無(wú)論開(kāi)學(xué)之后還會(huì)不會(huì)增加課程供學(xué)生選擇,都沒(méi)有關(guān)系。那么我們要呈現(xiàn)給用戶看的報(bào)表一般是這樣的:
圖2
可以看到存儲(chǔ)數(shù)據(jù)的時(shí)候采用的是列式存儲(chǔ),最終呈現(xiàn)的數(shù)據(jù)是行式顯示,如何實(shí)現(xiàn)?下面詳細(xì)分析講解:
創(chuàng)建表語(yǔ)句
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ù)
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ǔ)句:
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,可以這樣做:
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)。
例如學(xué)生選課和成績(jī)系統(tǒng)中就有一張表,該表存儲(chǔ)了學(xué)生的課程成績(jī),我們無(wú)法去預(yù)料課程的多少,因此一般表會(huì)設(shè)計(jì)為下面這樣:
圖1

最后一列是課程編號(hào),這樣無(wú)論開(kāi)學(xué)之后還會(huì)不會(huì)增加課程供學(xué)生選擇,都沒(méi)有關(guān)系。那么我們要呈現(xiàn)給用戶看的報(bào)表一般是這樣的:
圖2

可以看到存儲(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)。
您可能感興趣的文章:
- sql 普通行列轉(zhuǎn)換
- 一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語(yǔ)句
- sqlserver2005 行列轉(zhuǎn)換實(shí)現(xiàn)方法
- 玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換
- 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
- PostgreSQL實(shí)現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
- sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
- SQL Server 使用 Pivot 和 UnPivot 實(shí)現(xiàn)行列轉(zhuǎn)換的問(wèn)題小結(jié)
- SQL Server使用PIVOT與unPIVOT實(shí)現(xiàn)行列轉(zhuǎn)換
- MySQL實(shí)現(xiàn)行列轉(zhuǎn)換
- SQL行列轉(zhuǎn)換超詳細(xì)四種方法詳解
- SQL Server行列轉(zhuǎn)換的實(shí)現(xiàn)示例
- SQLServer使用 PIVOT 和 UNPIVOT行列轉(zhuǎn)換
相關(guān)文章
玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換
雖然開(kāi)發(fā)過(guò)程中沒(méi)用過(guò)行列轉(zhuǎn)換,但是聽(tīng)說(shuō)面試時(shí)常常會(huì)遇到這個(gè)問(wèn)題,以前在網(wǎng)上也看到過(guò)大神的例子,今天自己仔細(xì)的玩了下,希望和大家分享一下了2013-11-11SQLServer2005 批量查詢自定義對(duì)象腳本
使用系統(tǒng)函數(shù)object_definition和系統(tǒng)表 sysobjects 就可以了2009-08-08SQLServer Job運(yùn)行成功或失敗時(shí)發(fā)送電子郵件通知的圖文教程
雖然我們可以通過(guò)Job日志來(lái)查看SQL Server Job運(yùn)行成功或是失敗,但是人工主動(dòng)去查沒(méi)有及時(shí)性,也不智能化。下面簡(jiǎn)單介紹一下如何設(shè)置SQL Server的郵件通知,讓Job完成后,自動(dòng)發(fā)送狀態(tài)郵件。2009-09-09sqlserver2005自動(dòng)創(chuàng)建數(shù)據(jù)表和自動(dòng)添加某個(gè)字段索引
C#編程程序的時(shí)候,讓程序自動(dòng)創(chuàng)建數(shù)據(jù)表,然后給數(shù)據(jù)表添加索引,這個(gè)方法是在百度百科找到,我自已只是簡(jiǎn)單的修改了一下2012-06-06sql里將重復(fù)行數(shù)據(jù)合并為一行數(shù)據(jù)使用逗號(hào)進(jìn)行分隔
sql里將重復(fù)行數(shù)據(jù)合并為一行,將多行fieldname字段的內(nèi)容串聯(lián)起來(lái),用逗號(hào)分隔,接下來(lái)為大家介紹下詳細(xì)的實(shí)現(xiàn)sql語(yǔ)句,希望對(duì)你有所幫助2013-04-04SQL2005 性能監(jiān)視器計(jì)數(shù)器錯(cuò)誤解決方法
vps主機(jī)客戶和服務(wù)器托管用戶在不正當(dāng)刪除SQL2005后會(huì)造成SQL2005 性能監(jiān)視器計(jì)數(shù)器錯(cuò)誤,現(xiàn)在我們提供SQL2005 性能監(jiān)視器計(jì)數(shù)器錯(cuò)誤如何解決的辦法如下,請(qǐng)大家參考指正2012-01-01