自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server 2005新功能之PIVOT的描述

數(shù)據(jù)庫 SQL Server
我們今天主要描述的是SQL Server 2005新功能之PIVOT,假如你對其相關(guān)內(nèi)容想了解的話,你就可以瀏覽以下的文章對其進(jìn)行了解。

以下的文章主要描述的是SQL Server 2005新功能之PIVOT,在工具的升級中,我個人認(rèn)為首先我們的看看這個工具,其主要是在哪些功能上得到加強(qiáng),所以今天我們就來看看SQL2005這個PIVOT吧。PIVOT 關(guān)系運(yùn)算符對表值表達(dá)式進(jìn)行操作以獲得另一個表。

PIVOT 通過將表達(dá)式某一列中的唯一值轉(zhuǎn)換為輸出中的多個列來轉(zhuǎn)換表。工具的升級,我以為得先看看這個工具在哪些功能上得到加強(qiáng),今天我們就看看SQL2005這個PIVOT吧。PIVOT 關(guān)系運(yùn)算符對表值表達(dá)式進(jìn)行操作以獲得另一個表。PIVOT 通過將表達(dá)式某一列中的唯一值轉(zhuǎn)換為輸出中的多個列來轉(zhuǎn)換表值表達(dá)式,并在必要時(shí)對最終輸出中所需的任何其余的列值執(zhí)行聚合。

記得我們在SQL2000中要用聚合和CASE語句完成一個行列轉(zhuǎn)換吧,特別當(dāng)待轉(zhuǎn)成列的數(shù)據(jù)不定時(shí),我們往往構(gòu)造動態(tài)SQL,然后用EXEC來運(yùn)行。

 

環(huán)境準(zhǔn)備:

 

  1. -- Author: happyflsytone   
  2. -- Version:V1.001   
  3. -- Date:2008-09-18 10:20:53   
  4. -- Test Data: ta   
  5. IF OBJECT_ID('ta') IS NOT NULL   
  6. DROP TABLE ta   
  7. ;   
  8. CREATE TABLE ta(id INT,col1 Nvarchar(2),col2 Nvarchar(2),col3 Nvarchar(4),col4 INT)   
  9. ;   
  10. INSERT INTO ta   
  11. SELECT 1,'HN','CS','abc',1 UNION ALL   
  12. SELECT 2,'HN','CS','abcd',2 UNION ALL   
  13. SELECT 3,'HN','CD','abcd' ,3UNION ALL   
  14. SELECT 4,'HN','HY','ae' ,4   
  15. ;   

我們先來回顧SQL2000的行列轉(zhuǎn)換,比如我們對上例程把col3轉(zhuǎn)列顯示,并把col4的和當(dāng)對應(yīng)列值。我們分兩種情況來討論:

一、當(dāng)col3的列值固定就是'abc','abcd','ae'三種情況

 

  1. SELECT   
  2. col1,   
  3. col2,   
  4. [abc] = SUM(CASE WHEN col3 = 'abc' THEN col4 ELSE 0 END),   
  5. [abcd] = SUM(CASE WHEN col3 = 'abcd' THEN col4 ELSE 0 END),   
  6. [ae] = SUM(CASE WHEN col3 = 'ae' THEN col4 ELSE 0 END)   
  7. FROM ta   
  8. GROUP BY col1,col2   
  9. /*   
  10. col1 col2 abc abcd ae   
  11. HN CD 0 3 0   
  12. HN CS 1 2 0   
  13. HN HY 0 0 4  

(3 行受影響)

 

二、當(dāng)col3的列值不固定時(shí)就運(yùn)用動態(tài)SQL,其實(shí)也就是構(gòu)造一個sum(CASE WHEN ...)SQL字符串

 

  1. DECLARE @s varchar(8000)   
  2. SELECT @s = isnull(@s+',   
  3. ','') +'['+col3+'] = SUM(CASE WHEN col3 = '''+col3+''' THEN col4 ELSE 0 END)'   
  4. FROM ( SELECT distinct col3 FROM ta) a   
  5. SET @s = 'SELECT   
  6. col1,   
  7. col2,   
  8. '+@s + '   
  9. FROM ta   
  10. GROUP BY   
  11. col1,col2'   
  12. EXEC(@s)   
  13. /*   
  14. col1 col2 abc abcd ae   
  15. HN CD 0 3 0   
  16. HN CS 1 2 0   
  17. HN HY 0 0 4  

(3 行受影響)

 

我們先輸入這個@S看看是什么東東,只要加上print @s

 

  1. SELECT   
  2. col1,   
  3. col2,   
  4. [abc] = SUM(CASE WHEN col3 = 'abc' THEN col4 ELSE 0 END),   
  5. [abcd] = SUM(CASE WHEN col3 = 'abcd' THEN col4 ELSE 0 END),   
  6. [ae] = SUM(CASE WHEN col3 = 'ae' THEN col4 ELSE 0 END)   
  7. FROM ta   
  8. GROUP BY   
  9. col1,col2  

其實(shí)就是上面我們構(gòu)造的固定列值的SQL嘛。

好,現(xiàn)在們開始在2005中實(shí)現(xiàn)這個功能,先來看看2005的FROM子句的定義(關(guān)于如何看這個定義請參照SQL2005的文檔約定及Transate-SQL語法約定):

 

  1. [ FROM { <table_source> } [ ,...n ] ]   
  2. <table_source> ::=   
  3. {   
  4. <pivoted_table>   
  5. }   
  6. <pivoted_table> ::=   
  7. table_source PIVOT <pivot_clause> table_alias   
  8. <pivot_clause> ::=   
  9. ( aggregate_function ( value_column )   
  10. FOR pivot_column   
  11. IN ( <column_list> )   
  12. )   
  13. <column_list> ::=   
  14. column_name [ , ... ]   

pivot_column 和 value_column 是 PIVOT 運(yùn)算符使用的組合列。PIVOT 遵循以下過程獲得輸出結(jié)果集:

對分組列的 input_table 執(zhí)行 GROUP BY,為每個組生成一個輸出行。

 

輸出行中的分組列獲得 input_table 中該組的對應(yīng)列值。

 

通過執(zhí)行以下操作,為每個輸出行生成列列表中的列的值:

 

針對 pivot_column,對上一步在 GROUP BY 中生成的行另外進(jìn)行分組。

 

對于 column_list 中的每個輸出列,選擇滿足以下條件的子組:

 

  1. pivot_column = CONVERT(<data type of pivot_column>, 'output_column')  

針對此子組上的 aggregate_function 對 value_column 求值,其結(jié)果作為相應(yīng)的 output_column 的值返回。如果該子組為空,SQL Server 2005 將為該 output_column 生成空值。如果聚合函數(shù)是 COUNT,且子組為空,則返回零 (0)。

 

接著我們利用我們開頭的例子來理解一下這個FROM子句,很顯然我們的col4對應(yīng)上面的value_column,我們還假定列會下固定為這三項(xiàng),那么列 col3 對應(yīng)上面的pivot_column,進(jìn)而我們應(yīng)該得出[abc],[abcd],[ae]是column_name即我們的輸出列,最后我們只要構(gòu)造一下table_source就可以了,如何構(gòu)造這個table_source,顯然pivot_column 和 value_column應(yīng)該包含在其中,其它就應(yīng)該是你想要分組的列啦.

 

我們來總結(jié)一下:這個FROM子句是基于 table_source 對 pivot_column 進(jìn)行透視,table_source 中 pivot_column 和 value_column 列之外的列被稱為透視運(yùn)算符的組合列,而PIVOT 是對輸入表執(zhí)行組合列的分組操作,并為每個組返回一行,好,我們試著寫出這個SQL:

 

  1. SELECT col1,col2,[abc],[abcd],[ae]   
  2. FROM   
  3. (SELECT col1,col2,col3,col4   
  4. FROM ta ) p   
  5. PIVOT   
  6. ( SUM (col4)   
  7. FOR col3 IN ([abc],[abcd],[ae])   
  8. )AS unpvt  

我們執(zhí)行一下看看結(jié)果:

  1. /*   
  2. col1 abc abcd ae  

以上的相關(guān)內(nèi)容就是對SQL Server 2005 的新功能的介紹,望你能有所收獲。

【編輯推薦】

  1. SQL Server行轉(zhuǎn)列的什么情況下被用?
  2. SQL Server獲取表的容量很簡單!
  3. SQL Server排序遇到NULL,不怕不帕!
  4. SQL Server 2005兩種快照隔離機(jī)制的不同之處
  5. SQL Server 2008 FileStream支持“真功夫版”

 

責(zé)任編輯:佚名 來源: 酷殼
相關(guān)推薦

2011-02-28 17:41:20

SQL Server

2010-06-30 10:15:40

SQL Server

2010-07-23 09:53:29

SQL Server

2010-07-20 11:01:51

SQL Server

2010-06-17 15:09:49

SQL Server

2010-06-18 13:41:33

SQL Server

2010-06-17 15:24:51

SQL SERVER

2010-07-19 11:01:55

SQL Server

2010-07-06 15:40:49

SQL Server

2010-07-20 09:15:03

SQL Server

2010-07-05 12:33:13

SQL Server

2010-07-05 13:19:36

2010-12-23 09:25:20

SQL Server

2009-10-23 12:44:35

SQL SERVER

2010-06-30 09:36:25

SQL Server

2009-10-23 11:12:21

SQL Server

2010-06-28 13:27:33

SQL Server視

2011-08-22 11:23:41

SQL Server 數(shù)據(jù)修改

2015-08-27 15:03:08

Live Query sql2016Livesql2016 調(diào)優(yōu)s

2010-07-23 12:55:29

SQL Server
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號