SQL動態交叉表

2021-04-18 08:58:35 字數 3689 閱讀 8093

動態交叉表就是列表可以根據表中資料的情況動態建立列。

動態查詢不能使用

select

語句實現,它可以利用儲存過程實現。思路是:

首先檢索列頭資訊,形成乙個游標,然後遍歷游標,將上面靜態交叉表實現過程中使用

case

語句判斷的內容用游標裡的值替代,形成一條新的

sql查詢語句,然後執行並返回結果。下面是乙個通用的實現動態交叉表的儲存過程:

create procedure proc_across_table @tablename as varchar(50),       --生成交叉表依據的表名 @newcolumn as varchar(50),       --生成表頭依據的欄位名 @groupcolumn as varchar(50),     --分組依據的欄位名 @statcolumn as varchar(50),      --欲統計的欄位名 @operator as varchar(10)         --統計的運算方式 as declare @sql as varchar(1000), @column as varchar(50) --定義引數 execute ('declare cursor_new_column cursor for select distinct ' + @newcolumn + ' from ' + @tablename + ' for read only ') --定義游標 begin   set nocount on    set @sql='select ' + @groupcolumn + ', ' + @operator + '(' + @statcolumn + ') as [' + @operator + ' of ' + @statcolumn + ']' --定義sql語句頭   open cursor_new_column   while (0=0)   begin --遍歷游標     fetch next from cursor_new_column into @column --通過游標獲取列頭資訊     if (@@fetch_status<>0) break         set @sql = @sql + ', ' + @operator + '(case ' + @newcolumn + ' when ''' + @column + ''' then ' + @statcolumn + ' else null end) as [' + @column + ']' --迴圈追加sql語句   end set @sql = @sql + ' from ' + @tablename + ' group by ' + @groupcolumn --定義sql語句尾   execute(@sql) --執行sql語句   print @sql --輸出sql語句   if @@error <>0 return @@error --如果出錯,則返回錯誤**   close cursor_new_column --關閉游標   deallocate cursor_new_column return 0 --釋放游標,釋放成功則返回0 end go

在sql server

查詢分析器上執行下面的**,就可以得到

動態交叉表。

proc_across_table '

商品銷售表

', '

訂單號', '

商品名', '

訂貨數量

', 'sum'

在sql server

查詢分析器上呼叫儲存過程時,最前面的為將要呼叫的儲存過程的名稱,後面為執行儲存過程需要的引數,引數用引號括起,儲存過程名稱與引數之間用空格分隔,引數之間用逗號分隔。

說明:這是乙個通用的儲存過程,只要正確的傳入生成交叉表依據的表名(

@tablename

)、生成表頭依據的欄位名(

@newcolumn

)、生成主鍵列依據的欄位名(

@groupcolumn

)、欲統計的欄位名(

@statcolumn

)和統計的運算方式(

@operator

),就可以成功的將其應用到任何資料表中。

實現動態交叉表時用到了游標,下面對游標進行詳細介紹。

每個游標有

4個組成部分,這

4個組成部分必須符合下面的順序:(1

)宣告游標;(2

)開啟游標;(3

)從乙個游標中查詢資訊;(4

)關閉游標。

其中,宣告游標主要使用

declare cursor

語句,下面介紹該語句。

語法:declare cursor_name [ insensitive ] [ scroll ] cursor for select_statement [ for  ]

上面介紹的是

sql-92

的遊標語法規則,下面介紹

sql server

提供的擴充套件了的游標宣告語法,它通過增加另外的保留字,使游標的功能進一步得到增強,其語法為:

declare cursor_name cursor  [ local | global ]  [ forward_only | scroll ]  [ static | keyset | dynamic | fast_forward ] [ read_only | scroll_locks | optimistic ] [ type_warning ] for select_statement [ for update [ of column_name [ ,...n ] ] ]   

對基表中的非鍵值所做的更改(由游標所有者更改或由其他使用者提交)可以在使用者滾動游標時看到。其他使用者執行的插入是不可見的(不能通過

transact-sql

伺服器游標執行插入)。如果刪除行,則在嘗試提取行時返回值為-2的

@@fetch_status

。從游標以外更新鍵值類似於刪除舊行然後再插入新行。具有新值的行是不可見的,並在嘗試提取具有舊值的行時,將返回值為-2的

@@fetch_status

。如果通過指定

where current of

子句利用游標來完成更新,則新值是可見的。  

如果select_statement

中的子句與所請求的游標型別的功能有衝突,則

sql server

會將游標隱式轉換為其他型別。

注意:在

sql server 2000

中,fast_forward

和forward_only

游標選項是相互排斥的。如果指定了其中的乙個,則不能指定另乙個,否則會引發錯誤。在

sql server 2005

中,這兩個關鍵字可以用在同乙個

declare cursor

語句中。

注意:如果查詢引用了至少乙個無惟一索引的表,則鍵集游標將轉換為靜態游標。

注意:如果

global

和local

引數都未指定,則預設值由

default to local cursor

資料庫選項的設定控制。在

sql server 7.0

版中,該選項預設為

false

,以便與

sql server

的早期版本相匹配,在早期版本中,所有游標都是全域性的,該選項的預設值在以後的

sql server

版本中可能會更改。

:定義的

transact-sql

伺服器游標的名稱。

cursor_name

必須符合識別符號規則。

:用於指定游標的名稱。

SQL實現動態交叉表 用游標實現

set quoted identifier on goset ansi nulls on goalter procedure crosstable strtablename as varchar 50 查詢表 strcol as varchar 50 strgroup as varchar 50 分...

動態交叉表總結

declare sql varchar 8000 看論壇裡討論動態交叉表這麼多貼,小結了一下.其實建立動態交叉表裡是應用了遞迴的select變數這種概念,遞迴的select變數可以使用select語句和子查詢將乙個變數與其自身拼接起來。乙個標準的建立動態交叉表的code我歸納如下 declare s...

oracle動態交叉表

有一張表 id name quarter quantity 1 開發部 春天 10000 2 開發部 夏天 50000 3 開發部 秋天 30000 4 開發部 冬天 20000 5 銷售部 春天 10000 6 銷售部 夏天 4000 7 銷售部 秋天 30000 8 銷售部 冬天 20000 想...