declare @sql varchar(8000)
看論壇裡討論動態交叉表這麼多貼,小結了一下.
其實建立動態交叉表裡是應用了遞迴的select變數這種概念,遞迴的select變數可以使用select語句和子查詢將乙個變數與其自身拼接起來。
乙個標準的建立動態交叉表的code我歸納如下:
declare @sql varchar(8000)
set @sql = 'select columna,'
select @sql = @sql + 'sum(case columnb when '''+columnb+ ''' then columnc else 0 end) as '''+columnb+ ''','
from (select distinct columnb from table) as a
select @sql = left(@sql,len(@sql)-1) + ' from table group by columna'
exec(@sql)
go相信這個可以實現絕大部分動態交叉表
example:
declare @s nvarchar(4000)
set @s=''
select @s=@s+n',sum(case 所屬糖廠 when n'''+所屬糖廠+n''' then 實際重量 else 0 end) as '+所屬糖廠
from v_ponderationinfo_gather group by 所屬糖廠 order by 所屬糖廠
select @s=n'select ''總噸位'' as 所屬糖廠 '+@s+' from v_ponderationinfo_gather group by 所屬糖廠'
exec(@s)
declare @s nvarchar(4000)
set @s=''
select @s=@s+n',sum(case 所屬糖廠 when n'''+所屬糖廠+n''' then 實際重量 else 0 end) as '+所屬糖廠
from v_ponderationinfo_gather group by 所屬糖廠 order by 所屬糖廠
select @s=n'select n''總噸位'' as 所屬糖廠 '+@s+n' from v_ponderationinfo_gather'
exec(@s)
go
SQL動態交叉表
動態交叉表就是列表可以根據表中資料的情況動態建立列。動態查詢不能使用 select 語句實現,它可以利用儲存過程實現。思路是 首先檢索列頭資訊,形成乙個游標,然後遍歷游標,將上面靜態交叉表實現過程中使用 case 語句判斷的內容用游標裡的值替代,形成一條新的 sql查詢語句,然後執行並返回結果。下面...
oracle動態交叉表
有一張表 id name quarter quantity 1 開發部 春天 10000 2 開發部 夏天 50000 3 開發部 秋天 30000 4 開發部 冬天 20000 5 銷售部 春天 10000 6 銷售部 夏天 4000 7 銷售部 秋天 30000 8 銷售部 冬天 20000 想...
動態交叉表的實現
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...