Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
更新時(shí)間:2013年08月15日 15:48:58 作者:
pivot和unpivot實(shí)現(xiàn)行列轉(zhuǎn)換,這極大的方便了我們存儲數(shù)據(jù)和呈現(xiàn)數(shù)據(jù),下面對這兩個(gè)關(guān)鍵字進(jìn)行分析,結(jié)合實(shí)例講解如何存儲數(shù)據(jù),如何呈現(xiàn)數(shù)據(jù)
從MS Sql Server 2005微軟就推出了pivot和unpivot實(shí)現(xiàn)行列轉(zhuǎn)換,這極大的方便了我們存儲數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)。今天就對這兩個(gè)關(guān)鍵字進(jìn)行分析,結(jié)合實(shí)例講解如何存儲數(shù)據(jù),如何呈現(xiàn)數(shù)據(jù)。
例如學(xué)生選課和成績系統(tǒng)中就有一張表,該表存儲了學(xué)生的課程成績,我們無法去預(yù)料課程的多少,因此一般表會設(shè)計(jì)為下面這樣:
圖1
最后一列是課程編號,這樣無論開學(xué)之后還會不會增加課程供學(xué)生選擇,都沒有關(guān)系。那么我們要呈現(xiàn)給用戶看的報(bào)表一般是這樣的:
圖2
可以看到存儲數(shù)據(jù)的時(shí)候采用的是列式存儲,最終呈現(xiàn)的數(shù)據(jù)是行式顯示,如何實(shí)現(xiàn)?下面詳細(xì)分析講解:
創(chuàng)建表語句
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
插入測試數(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é)果,那么使用下面的語句:
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ù)庫表存儲的就是圖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)為為行式存儲的方式,再用unpivot進(jìn)行列式呈現(xiàn)。
例如學(xué)生選課和成績系統(tǒng)中就有一張表,該表存儲了學(xué)生的課程成績,我們無法去預(yù)料課程的多少,因此一般表會設(shè)計(jì)為下面這樣:
圖1
最后一列是課程編號,這樣無論開學(xué)之后還會不會增加課程供學(xué)生選擇,都沒有關(guān)系。那么我們要呈現(xiàn)給用戶看的報(bào)表一般是這樣的:
圖2
可以看到存儲數(shù)據(jù)的時(shí)候采用的是列式存儲,最終呈現(xiàn)的數(shù)據(jù)是行式顯示,如何實(shí)現(xiàn)?下面詳細(xì)分析講解:
創(chuàng)建表語句
復(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
插入測試數(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é)果,那么使用下面的語句:
復(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ù)庫表存儲的就是圖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)為為行式存儲的方式,再用unpivot進(jìn)行列式呈現(xiàn)。
您可能感興趣的文章:
- sql 普通行列轉(zhuǎn)換
- 一個(gè)簡單的SQL 行列轉(zhuǎn)換語句
- sqlserver2005 行列轉(zhuǎn)換實(shí)現(xiàn)方法
- 玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫行列轉(zhuǎn)換
- 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
- PostgreSQL實(shí)現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
- sql server通過pivot對數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
- SQL Server 使用 Pivot 和 UnPivot 實(shí)現(xiàn)行列轉(zhuǎ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)文章
Sql server 2005安裝時(shí)ASP.Net版本注冊要求警告的解決方法
這篇文章主要介紹了Sql server 2005安裝時(shí)ASP.Net版本注冊要求警告的解決方法,需要的朋友可以參考下2015-01-01
快速將珊瑚蟲IP數(shù)據(jù)庫轉(zhuǎn)MS SQL2005的圖文教程
在幻想曲BLOG上看到不少朋友說,最近服務(wù)器上的IP數(shù)據(jù)好像不是很準(zhǔn)確,于是重新做了一個(gè)新的,不少朋友可能需要這個(gè)數(shù)據(jù)庫,因?yàn)槲募蟮木壒?,所以直接提供快速轉(zhuǎn)換方法。2008-08-08
安裝MSSql2005時(shí) “以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起” 的解決辦法
安裝MSSql2005時(shí) “以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起” 的解決辦法2010-02-02
SQL2005 性能監(jiān)視器計(jì)數(shù)器錯(cuò)誤解決方法
vps主機(jī)客戶和服務(wù)器托管用戶在不正當(dāng)刪除SQL2005后會造成SQL2005 性能監(jiān)視器計(jì)數(shù)器錯(cuò)誤,現(xiàn)在我們提供SQL2005 性能監(jiān)視器計(jì)數(shù)器錯(cuò)誤如何解決的辦法如下,請大家參考指正2012-01-01
SQL Server 2005通用分頁存儲過程及多表聯(lián)接應(yīng)用
分頁存儲過程在好多文章中都有介紹過;本篇是不久前寫的一個(gè)分頁存儲過程,可應(yīng)用于SQL Server 2005上面,感興趣的朋友可以研究下,希望本文對你學(xué)習(xí)存儲過程有所幫助2013-01-01
簡單實(shí)用SQL腳本Part SQLServer 2005 鏈接服務(wù)器
SQL Server 2005版本的SSMS中已經(jīng)有了 服務(wù)器對象->鏈接服務(wù)器 的功能點(diǎn),用戶首先創(chuàng)建一個(gè)遠(yuǎn)程DB的鏈接對象,之后就可以像本地表一樣執(zhí)行表的DML了。2010-09-09
win2003 Server配置SQL Server 2005遠(yuǎn)程連接的方法
這篇文章主要介紹了win2003 Server配置SQL Server 2005遠(yuǎn)程連接的方法,需要的朋友可以參考下2015-01-01

