成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server 2005新功能之PIVOT的描述

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

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

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

記得我們在SQL2000中要用聚合和CASE語句完成一個行列轉換吧,特別當待轉成列的數據不定時,我們往往構造動態SQL,然后用EXEC來運行。

 

環境準備:

 

  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的行列轉換,比如我們對上例程把col3轉列顯示,并把col4的和當對應列值。我們分兩種情況來討論:

一、當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 行受影響)

 

二、當col3的列值不固定時就運用動態SQL,其實也就是構造一個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  

其實就是上面我們構造的固定列值的SQL嘛。

好,現在們開始在2005中實現這個功能,先來看看2005的FROM子句的定義(關于如何看這個定義請參照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 運算符使用的組合列。PIVOT 遵循以下過程獲得輸出結果集:

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

 

輸出行中的分組列獲得 input_table 中該組的對應列值。

 

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

 

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

 

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

 

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

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

 

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

 

我們來總結一下:這個FROM子句是基于 table_source 對 pivot_column 進行透視,table_source 中 pivot_column 和 value_column 列之外的列被稱為透視運算符的組合列,而PIVOT 是對輸入表執行組合列的分組操作,并為每個組返回一行,好,我們試著寫出這個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  

我們執行一下看看結果:

  1. /*   
  2. col1 abc abcd ae  

以上的相關內容就是對SQL Server 2005 的新功能的介紹,望你能有所收獲。

【編輯推薦】

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

 

責任編輯:佚名 來源: 酷殼
相關推薦

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-17 15:24:51

SQL SERVER

2010-06-18 13:41:33

SQL Server

2010-07-19 11:01:55

SQL Server

2010-07-20 09:15:03

SQL Server

2010-07-06 15:40:49

SQL Server

2010-07-05 13:19:36

2010-07-05 12:33:13

SQL Server

2010-12-23 09:25:20

SQL Server

2010-06-28 13:27:33

SQL Server視

2009-10-23 11:12:21

SQL Server

2010-06-30 09:36:25

SQL Server

2009-10-23 12:44:35

SQL SERVER

2015-08-27 15:03:08

Live Query sql2016Livesql2016 調優s

2011-08-22 11:23:41

SQL Server 數據修改

2010-07-23 12:55:29

SQL Server
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久999| 欧美一区二区三区在线视频 | 国产激情视频网址 | 久久久精品 | 久久久久久免费毛片精品 | 毛片网站在线观看视频 | 4hu最新网址 | 日本网站在线看 | av在线一区二区三区 | 成人深夜福利 | 成人影音 | 亚洲福利在线观看 | 大陆一级毛片免费视频观看 | 亚洲欧美激情精品一区二区 | 国产精品99久久久久久宅男 | 亚洲品质自拍视频 | 亚洲成人一区二区三区 | 久久久久一区 | 一区二区三区影院 | 在线免费看黄 | 国产成人免费视频网站视频社区 | 国产精品久久久久久婷婷天堂 | 久久欧美高清二区三区 | 欧美精品区 | 国产精品久久久久久久久大全 | 999视频 | 欧美精品第三页 | 国产一区二区三区免费 | 欧美日韩国产一区二区三区 | 免费成人在线网站 | 国产一区久久精品 | 国产成人福利在线观看 | 国外成人在线视频网站 | 日韩一区二区久久 | 最新中文在线视频 | 在线日韩视频 | 久久精品视频在线免费观看 | 欧美一区视频 | av黄色免费 | 羞羞午夜 | 国产999精品久久久久久 |