佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 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ù)

熱門(mén)標(biāo)簽:網(wǎng)站排名優(yōu)化 AI電銷(xiāo) 百度競(jìng)價(jià)排名 呼叫中心市場(chǎng)需求 服務(wù)外包 Linux服務(wù)器 鐵路電話系統(tǒng) 地方門(mén)戶(hù)網(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ī),我們無(wú)法去預(yù)料課程的多少,因此一般表會(huì)設(shè)計(jì)為下面這樣:
圖1
 
最后一列是課程編號(hào),這樣無(wú)論開(kāi)學(xué)之后還會(huì)不會(huì)增加課程供學(xué)生選擇,都沒(méi)有關(guān)系。那么我們要呈現(xiàn)給用戶(hù)看的報(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)在查詢(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)。
您可能感興趣的文章:
  • 一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語(yǔ)句
  • sqlserver2005 行列轉(zhuǎn)換實(shí)現(xiàn)方法
  • C#中DataTable實(shí)現(xiàn)行列轉(zhuǎn)換的方法
  • 淺析SQL語(yǔ)句行列轉(zhuǎn)換的兩種方法 case...when與pivot函數(shù)的應(yīng)用
  • sql 普通行列轉(zhuǎn)換
  • 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
  • 玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換
  • Oracle實(shí)現(xiàn)行列轉(zhuǎn)換的方法分析
  • JS控制網(wǎng)頁(yè)動(dòng)態(tài)生成任意行列數(shù)表格的方法
  • 數(shù)據(jù)庫(kù)實(shí)現(xiàn)行列轉(zhuǎn)換(mysql示例)

標(biāo)簽:衡水 銅川 崇左 湘潭 蘭州 黃山 仙桃 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢(xún)

    • 400-1100-266
    大余县| 阿图什市| 云安县| 岳普湖县| 咸阳市| 扬中市| 柳河县| 稻城县| 丰顺县| 泉州市| 梨树县| 四平市| 阜南县| 水城县| 朝阳区| 无棣县| 巴中市| 富锦市| 衡阳市| 鄯善县| 富蕴县| 怀仁县| 赣榆县| 连云港市| 阳西县| 大足县| 荃湾区| 宁强县| 出国| 曲水县| 淳化县| 大足县| 福清市| 南城县| 天台县| 南和县| 德江县| 高雄县| 黄骅市| 西华县| 湛江市|