Sql實現行列轉換方便了我們存儲數據和呈現數據
更新時間:2013年08月15日 15:48:58 作者:
pivot和unpivot實現行列轉換,這極大的方便了我們存儲數據和呈現數據,下面對這兩個關鍵字進行分析,結合實例講解如何存儲數據,如何呈現數據
從MS Sql Server 2005微軟就推出了pivot和unpivot實現行列轉換,這極大的方便了我們存儲數據和呈現數據。今天就對這兩個關鍵字進行分析,結合實例講解如何存儲數據,如何呈現數據。
例如學生選課和成績系統(tǒng)中就有一張表,該表存儲了學生的課程成績,我們無法去預料課程的多少,因此一般表會設計為下面這樣:
圖1
最后一列是課程編號,這樣無論開學之后還會不會增加課程供學生選擇,都沒有關系。那么我們要呈現給用戶看的報表一般是這樣的:
圖2
可以看到存儲數據的時候采用的是列式存儲,最終呈現的數據是行式顯示,如何實現?下面詳細分析講解:
創(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
插入測試數據
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 );
現在查詢下Table_1中的數據即為圖1中的結果,現在我們要得到圖2的結果,那么使用下面的語句:
SELECT [name],[1],[2],[3]
FROM [master].[dbo].[Table_1]
pivot
(
sum(score) for subject_id in ([1],[2],[3])
) as pvt
GO
如果本身數據庫表存儲的就是圖2那樣,要變成圖1的方式呈現,那就需要用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
當然我還是在Table_1的基礎上先用pvt轉為為行式存儲的方式,再用unpivot進行列式呈現。
例如學生選課和成績系統(tǒng)中就有一張表,該表存儲了學生的課程成績,我們無法去預料課程的多少,因此一般表會設計為下面這樣:
圖1
最后一列是課程編號,這樣無論開學之后還會不會增加課程供學生選擇,都沒有關系。那么我們要呈現給用戶看的報表一般是這樣的:
圖2
可以看到存儲數據的時候采用的是列式存儲,最終呈現的數據是行式顯示,如何實現?下面詳細分析講解:
創(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
插入測試數據
復制代碼 代碼如下:
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 );
現在查詢下Table_1中的數據即為圖1中的結果,現在我們要得到圖2的結果,那么使用下面的語句:
復制代碼 代碼如下:
SELECT [name],[1],[2],[3]
FROM [master].[dbo].[Table_1]
pivot
(
sum(score) for subject_id in ([1],[2],[3])
) as pvt
GO
如果本身數據庫表存儲的就是圖2那樣,要變成圖1的方式呈現,那就需要用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
當然我還是在Table_1的基礎上先用pvt轉為為行式存儲的方式,再用unpivot進行列式呈現。
相關文章
Sql server 2005安裝時ASP.Net版本注冊要求警告的解決方法
這篇文章主要介紹了Sql server 2005安裝時ASP.Net版本注冊要求警告的解決方法,需要的朋友可以參考下2015-01-01
安裝MSSql2005時 “以前的某個程序安裝已在安裝計算機上創(chuàng)建掛起” 的解決辦法
安裝MSSql2005時 “以前的某個程序安裝已在安裝計算機上創(chuàng)建掛起” 的解決辦法2010-02-02
SQL Server 2005通用分頁存儲過程及多表聯接應用
分頁存儲過程在好多文章中都有介紹過;本篇是不久前寫的一個分頁存儲過程,可應用于SQL Server 2005上面,感興趣的朋友可以研究下,希望本文對你學習存儲過程有所幫助2013-01-01
簡單實用SQL腳本Part SQLServer 2005 鏈接服務器
SQL Server 2005版本的SSMS中已經有了 服務器對象->鏈接服務器 的功能點,用戶首先創(chuàng)建一個遠程DB的鏈接對象,之后就可以像本地表一樣執(zhí)行表的DML了。2010-09-09
win2003 Server配置SQL Server 2005遠程連接的方法
這篇文章主要介紹了win2003 Server配置SQL Server 2005遠程連接的方法,需要的朋友可以參考下2015-01-01

