環境要求:2005+
在日常需求中常常會有行轉列的事情需求處理。假設不是動態的行,那麼我們能夠採取case when 羅列處理。
在sql 2005曾經處理動態行或列的時候,通常採用拼接字串的方法處理。在2005以後新增了pivot函式之後,我能夠利用這樣函式來處理。
1.動態sql注入式推斷函式
--既然是用到了動態sql,就有乙個老話題:sql注入。
建乙個注入性字元的推斷函式。 create function [dbo].[fn_checksqlinjection] ( @col nvarchar(4000) ) returns bit --假設存在可能的注入字元返回true,反之返回false as begin declare @result bit; if upper(@col) like upper(n'%0x%') or upper(@col) like upper(n'%;%') or upper(@col) like upper(n'%''%') or upper(@col) like upper(n'%--%') or upper(@col) like upper(n'%/*%*/%') or upper(@col) like upper(n'%exec%') or upper(@col) like upper(n'%xp_%') or upper(@col) like upper(n'%sp_%') or upper(@col) like upper(n'%select%') or upper(@col) like upper(n'%insert%') or upper(@col) like upper(n'%update%') or upper(@col) like upper(n'%delete%') or upper(@col) like upper(n'%truncate%') or upper(@col) like upper(n'%create%') or upper(@col) like upper(n'%alter%') or upper(@col) like upper(n'%drop%') set @result=1 else set @result=0 return @result end go
2.需求:
--通過日期查詢幾個表聯合,依照檢驗專案分類,按日期橫向展示
select a.檢驗專案 , convert(char(10),a.日期,120)日期,convert(decimal(18,2),cast((sum(a.測試數量)-sum(a.不良數量)) as decimal(18,2))/sum(測試數量))*100 as 良率
--into #tempcob
from (select 日期,檢驗專案, 測試數量, 不良數量 from 製程cob成測 union all
select 日期,檢驗專案, 測試數量, 不良數量 from 製程cob外觀 union all
select 日期,檢驗專案,測試數量, 不良數量 from 製程cob綁測 union all
select 送檢日期,'fqc_cob_檢驗',檢驗數量,不合格數量 from 製程fqc_cob_檢驗
) as a
where convert(char(10),日期,120)>='2014-10-01' and convert(char(10),日期,120)<= '2014-10-30'
group by a.檢驗專案,a.日期
3.解決方式:
--抓取資料寫入暫時表#tempcob
select a.檢驗專案 , convert(char(10),a.日期,120)日期,convert(decimal(18,2),cast((sum(a.測試數量)-sum(a.不良數量)) as decimal(18,2))/sum(測試數量))*100 as 良率
into #tempcob
from (select 日期,檢驗專案, 測試數量, 不良數量 from 製程cob成測 union all
select 日期,檢驗專案, 測試數量, 不良數量 from 製程cob外觀 union all
select 日期,檢驗專案,測試數量, 不良數量 from 製程cob綁測 union all
select 送檢日期,'fqc_cob_檢驗',檢驗數量,不合格數量 from 製程fqc_cob_檢驗
) as a
where convert(char(10),日期,120)>='2014-10-01' and convert(char(10),日期,120)<= '2014-10-30'
group by a.檢驗專案,a.日期
--檢視暫時表資料。取分布日期(不反覆)
--select 日期 from #tempcob
--select distinct 日期 from #tempcob
declare @sql nvarchar(4000)=n'';
--這裡使用了xml處理來處理類組字串
set @sql=stuff((select n','+quotename(b.日期) from (select distinct 日期 from #tempcob) as b
for xml path('')),1,1,n'');
--增加了xml處理和sql注入預防推斷
if dbo.fn_checksqlinjection(@sql)=0
set @sql='select * from #tempcob pivot (max(良率) for 日期 in ('+@sql+')) as tt'
exec(@sql);
drop table #tempcob
4.結果:
MSSQL 採用pivot函式實現動態行轉列
環境要求 2005 在日常需求中經常會有行轉列的事情需求處理,如果不是動態的行,那麼我們可以採取case when 羅列處理。在sql 2005以前處理動態行或列的時候,通常採用拼接字串的方法處理,在2005以後新增了pivot函式之後,我可以利用這樣函式來處理。1.環境要求 2005 在日常需求中...
PIVOT函式,行轉列
pivot函式的格式如下 pivot 聚合函式 聚合列值 for 行轉列前的列名 in 行轉列後的列名1 行轉列後的列名2 行轉列後的列名3 行轉列後的列名n select from shoppingcart as c pivot count totalprice for week in 1 2 3...
HIVE實現pivot函式
pivot是乙個非常實用的函式 pivot的格式 select 原表字段1,2,3 from 表名 as 原表別名 pivot 聚合函式 原表字段1 for 原表字段2 in 原表2值1 原表字段2值2 as 新錶別名 但是hive裡面沒有自帶pivot函式,所以我們需要自己實現 首先建立一組資料 ...