Je rédige un SP qui pourrait être utile à cette fin, essentiellement ce SP pivote n'importe quelle table et renvoie une nouvelle table pivotée ou simplement l'ensemble de données, voici comment l'exécuter :
Exec dbo.rs_pivot_table @schema=dbo,@table=nom_table,@column=colonne_a_pivoter,@agg='sum([colonne_a_agréger]),avg([une_autre_colonne_a_agréger]),',
@sel_cols='colonne_a_selectionner1,colonne_a_selectionner2,colonne_a_selectionner1',@new_table=table_retournée_pivotée;
veuillez noter que dans le paramètre @agg, les noms de colonnes doivent être entre '['
et le paramètre doit se terminer par une virgule ','
SP
Create Procedure [dbo].[rs_pivot_table]
@schema sysname=dbo,
@table sysname,
@column sysname,
@agg nvarchar(max),
@sel_cols varchar(max),
@new_table sysname,
@add_to_col_name sysname=null
Comme
--Exec dbo.rs_pivot_table dbo,##TEMPORAL1,tip_liq,'sum([val_liq]),sum([can_liq]),','cod_emp,cod_con,tip_liq',##TEMPORAL1PVT,'hola';
Commencer
Déclarer @query varchar(max)='';
Déclarer @aggDet varchar(100);
Déclarer @opp_agg varchar(5);
Déclarer @col_agg varchar(100);
Déclarer @pivot_col sysname;
Déclarer @query_col_pvt varchar(max)='';
Déclarer @full_query_pivot varchar(max)='';
Déclarer @ind_tmpTbl int; --Indicador de tabla temporal 1=tabla temporal global 0=Tabla fisica
Créer Table #pvt_column(
pivot_col varchar(100)
);
DECLARE @column_agg table(
opp_agg varchar(5),
col_agg varchar(100)
);
SI EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@table) AND type in (N'U'))
Set @ind_tmpTbl=0;
SINON SI OBJECT_ID('tempdb..'+ltrim(rtrim(@table))) IS NOT NULL
Set @ind_tmpTbl=1;
SI EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@new_table) AND type in (N'U')) OU
OBJECT_ID('tempdb..'+ltrim(rtrim(@new_table))) IS NOT NULL
Début
Set @query='DROP TABLE '+@new_table+'';
Exec (@query);
Fin;
Sélectionner @query='Select distinct '+@column+' From '+(case when @ind_tmpTbl=1 then 'tempdb.' else '' end)+@schema+'.'+@table+' where '+@column+' is not null;';
Print @query;
Insérer dans #pvt_column(pivot_col)
Exec (@query)
Tant que charindex(',',@agg,1)>0
Début
Sélectionner @aggDet=Subchaines(@agg,1,charindex(',',@agg,1)-1);
Insérer Dans @column_agg(opp_agg,col_agg)
Valeurs(subchaines(@aggDet,1,charindex('(',@aggDet,1)-1),ltrim(rtrim(replace(subchaines(@aggDet,charindex('[',@aggDet,1),charindex(']',@aggDet,1)-4),')',''))));
Set @agg=Subchaines(@agg,charindex(',',@agg,1)+1,len(@agg))
Fin
Déclarer cur_agg curseur read_only forward_only local static pour
Sélectionner
opp_agg,col_agg
from @column_agg;
Ouvrir cur_agg;
Fetch Prochain De cur_agg
Into @opp_agg,@col_agg;
Tant que @@fetch_status=0
Début
Déclarer cur_col curseur read_only forward_only local static pour
Sélectionner
pivot_col
De #pvt_column;
Ouvrir cur_col;
Fetch Prochain De cur_col
Into @pivot_col;
Tant que @@fetch_status=0
Début
Sélectionner @query_col_pvt='isnull('+@opp_agg+'(case when '+@column+'='+quotename(@pivot_col,char(39))+' then '+@col_agg+
' else null end),0) as ['+lower(Replace(Replace(@opp_agg+'_'+convert(varchar(100),@pivot_col)+'_'+replace(replace(@col_agg,'[',''),']',''),' ',''),'&',''))+
(case when @add_to_col_name is null then espace(0) else '_'+isnull(ltrim(rtrim(@add_to_col_name)),'') end)+']'
print @query_col_pvt
Sélectionner @full_query_pivot=@full_query_pivot+@query_col_pvt+', '
--print @full_query_pivot
Fetch Prochain De cur_col
Into @pivot_col;
Fin
Fermer cur_col;
Libérer cur_col;
Fetch Prochain De cur_agg
Into @opp_agg,@col_agg;
Fin
Fermer cur_agg;
Libérer cur_agg;
Sélectionner @full_query_pivot=substring(@full_query_pivot,1,len(@full_query_pivot)-1);
Sélectionner @query='Select '+@sel_cols+','+@full_query_pivot+' into '+@new_table+' From '+(case when @ind_tmpTbl=1 then 'tempdb.' else '' end)+
@schema+'.'+@table+' Group by '+@sel_cols+';';
print @query;
Exec (@query);
Fin;
GO
Voici un exemple d'exécution :
Exec dbo.rs_pivot_table @schema=dbo,@table=##TEMPORAL1,@column=tip_liq,@agg='sum([val_liq]),avg([can_liq]),',@sel_cols='cod_emp,cod_con,tip_liq',@new_table=##TEMPORAL1PVT;
alors Sélectionner * De ##TEMPORAL1PVT
retournerait :