動態交叉表的實現

2021-04-01 20:49:36 字數 2052 閱讀 5370

create procedure corsstab

@strtabname as varchar(50) = 'employees', --此處放表名

@strcol as varchar(50) = 'city',                       --表頭分組依據字段

@strgroup as varchar(50) = 'titleofcourtesy',--分組字段

@strnumber as varchar(50) = 'reportsto',    --被統計的字段

@strsum as varchar(10) = 'sum'                     --運算方式

asdeclare @strsql as varchar(1000), @strtmpcol as varchar(100)

execute ('declare corss_cursor cursor for select distinct ' + @strcol + ' from ' + @strtabname + ' for read only ') --生成游標

begin

set nocount on

set @strsql ='select ' + @strgroup + ', ' + @strsum + '(' + @strnumber + ') as [' + @strsum + ' of ' + @strnumber + ']' --查詢的前半段

open corss_cursor

while (0=0)

begin

fetch next from corss_cursor --遍歷游標,將列頭資訊放入變數@strtmpcol

into @strtmpcol

if (@@fetch_status<>0) break

set @strsql = @strsql + ', ' + @strsum + '(case ' + @strcol + ' when '' + @strtmpcol + '' then ' + @strnumber + ' else null end) as [' + @strtmpcol + ' ' + @strcol + ']' --構造查詢

endset @strsql = @strsql + ' from ' + @strtabname + ' group by ' + @strgroup --查詢結尾

execute(@strsql) --執行

if @@error <>0 return @@error --如果出錯,返回錯誤**

close corss_cursor

deallocate corss_cursor return 0 --釋放游標,返回0表示成功

endgo

幾點說明:

a、這是乙個通用儲存過程,使用時@strtabname、@strcol、@strgroup、@strnumber、@strsum幾個變數設定一下就可以用到其他表上,其中結果集的第二列我加了個合計列

b、為了測試方便,我在儲存過程中設定了預設值,就是前面提到的employees表,這樣直接執行時就可以出來我上面提到的結果。

c、使用時,可以把上面的**複製到企業管理器的查詢設計介面sql窗格,或者查詢分析器裡執行一下(注意正確選擇northwind資料庫),就可以生成乙個儲存過程:corsstab,然後直接執行corsstab,如果出現本文前面類似的窗格,就表示執行成功了。

d、假如用於其它表,首先需要在你的使用者資料庫裡生成此儲存過程(當然也可以放到master裡,然後再加個變數:@database,賦值為資料庫名稱,然後在上面**開啟指定資料庫,這樣所有的資料庫都可以呼叫它),當你呼叫時,採取以下格式:

corsstab @strtabname = 'orders', @strcol = 'datepart(yy, orderdate)',@strgroup = 'customerid', @strnumber = 'orderid', @strsum = 'count'

上面這條語句統計了northwind中orders表裡每個客戶年度訂單數量,大家可以執行試一下效果,雖然列頭顯示的名稱不恰當,但基本效果出來了,相信大家通過對我的**再作簡單修改,可以達到滿意的交叉表效果。

動態交叉表的實現

declare sql varchar 8000 set sql select makedate,select sql sql sum case status when status then status else 0 end as status from select distinct stat...

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

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

SQL動態交叉表

動態交叉表就是列表可以根據表中資料的情況動態建立列。動態查詢不能使用 select 語句實現,它可以利用儲存過程實現。思路是 首先檢索列頭資訊,形成乙個游標,然後遍歷游標,將上面靜態交叉表實現過程中使用 case 語句判斷的內容用游標裡的值替代,形成一條新的 sql查詢語句,然後執行並返回結果。下面...