日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SQLServer2005新功能之PIVOT的描述

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

創(chuàng)新互聯(lián)建站專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,綿陽主機(jī)托管,綿陽主機(jī)托管,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。

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á)式,并在必要時對最終輸出中所需的任何其余的列值執(zhí)行聚合。

記得我們在SQL2000中要用聚合和CASE語句完成一個行列轉(zhuǎn)換吧,特別當(dāng)待轉(zhuǎn)成列的數(shù)據(jù)不定時,我們往往構(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. CREATE TABLE ta(id INT,col1 Nvarchar(2),col2 Nvarchar(2),col3 Nvarchar(4),col4 INT) 
  8. INSERT INTO ta 
  9. SELECT 1,'HN','CS','abc',1 UNION ALL 
  10. SELECT 2,'HN','CS','abcd',2 UNION ALL 
  11. SELECT 3,'HN','CD','abcd' ,3UNION ALL 
  12. SELECT 4,'HN','HY','ae' ,4 

我們先來回顧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的列值不固定時就運(yùn)用動態(tài)SQL,其實也就是構(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 

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

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

 
 
 
  1. [ FROM {  } [ ,...n ] ] 
  2.  ::= 
  3.  
  4.  ::= 
  5. table_source PIVOT  table_alias 
  6.  ::= 
  7. ( aggregate_function ( value_column ) 
  8. FOR pivot_column 
  9. IN (  ) 
  10.  ::= 
  11. 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(, '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,我們還假定列會下固定為這三項,那么列 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 的新功能的介紹,望你能有所收獲。


當(dāng)前標(biāo)題:SQLServer2005新功能之PIVOT的描述
文章網(wǎng)址:http://www.5511xx.com/article/cdodisg.html