SQL server - 仅对部分结果进行透视
Posted
技术标签:
【中文标题】SQL server - 仅对部分结果进行透视【英文标题】:SQL server - Pivot only on a part of the result 【发布时间】:2016-09-08 12:29:31 【问题描述】:我只需要为查询结果的最后一列添加列。
查询是:
select
dpp.CODE_PORTEFEUILLE,
dpr.SOCIETE_GESTION,
lgp.CODE_GERANT,
lgp.DEVISE_GERANT,
lgp.CODE_INTERVENANT
from
GP3DBA.DESCRIPTIF_PORTEFEUILLE dpp
join GP3DBA.DESCRIPTIF_PORT_REPORTING dpr on dpp.CODE_PORTEFEUILLE = dpr.CODE_PORTEFEUILLE
join GP3DBA.LIEN_GERANT_PORTEFEUILLE lgp on dpp.CODE_PORTEFEUILLE = lgp.CODE_PORTEFEUILLE
结果:
期望的结果:
我自己尝试过,但没有任何令人满意的结果。
【问题讨论】:
最好在问题本身中包含所有信息并避免截图。大多数人都懒得看他们。 Sql aggregate function to obtain a list的可能重复 动态 SQL 与我的建议相差不远 【参考方案1】:编辑
我没有看到一个简单的方法来做到这一点。 在此示例中,您的实际结果在 #tmpResult 中。
select CODE_PORTEFEUILLE, SOCIETE_GESTION, count(1) as 'number'
into #columnNumber
from #tmpResult
group by CODE_PORTEFEUILLE, SOCIETE_GESTION
declare @columnMaxNumber int;
SELECT @columnMaxNumber = MAX(number)
FROM #columnNumber
declare @tableSql = 'CREATE TABLE #finalResult(
CODE_PORTEFEUILLE int not null,
SOCIETE_GESTION varchar(10) not null'
declare @cnt int = 0;
WHILE @cnt < @columnMaxNumber
BEGIN
set @tableSql = @tableSql + ', CODE_GERANT' + @cnt + ' varchar(2)'
set @tableSql = @tableSql + ', DEVISE_GERANT' + @cnt + ' varchar(3)'
set @tableSql = @tableSql + ', CODE_INTERVENANT' + @cnt + ' varchar(3)'
SET @cnt = @cnt + 1;
END
set @tableSql = @tableSql + ')'
exec @tableSql
那么你只需要在这个表中注入数据
declare cursor_portefeuille CURSOR FOR
select * from #tmpResult /*order by fields you want to order by*/
declare @code_portefeuille int, @societe_gestion varchar(3), @code_gerant varchar(2), @device_gerant varchar(3), @code_intervenant varchar(3), @gerant_index int = 0, @last_portefeuille int = 0, @last_societe varchar(3) = ''
OPEN cursor_portefeuille
FETCH NEXT FROM cursor_portefeuille
INTO @code_portefeuille, @societe_gestion, @code_gerant, @device_gerant, @code_intervenant
WHILE @@FETCH_STATUS = 0
BEGIN
if(@last_portefeuille = @code_portefeuille and @last_societe = @societe_gestion)
begin
set @gerant_index = @gerant_index + 1
end
else
begin
set @last_portefeuille = @code_portefeuille
set @last_societe = @societe_gestion
set @gerant_index = 0
end
if exists(select 1 from #finalResult where CODE_PORTEFEUILLE = @code_portefeuille and SOCIETE_GESTION = @societe_gestion)
begin
declare @sqlQuery varchar(512) = 'update #finalResult
set CODE_GERANT' + @gerant_index + ' = @code_gerant,
DEVISE_GERANT' + @gerant_index + ' = @device_gerant,
CODE_INTERVENANT' + @gerant_index + ' = @code_intervenant
WHERE CODE_PORTEFEUILLE = @code_portefeuille and SOCIETE_GESTION = @societe_gestion'
exec @sqlQuery;
end
else
begin
insert into #finalResult(CODE_PORTEFEUILLE, SOCIETE_GESTION, CODE_GERANT0, DEVISE_GERANT0, CODE_INTERVENANT0)
values(@code_portefeuille, @societe_gestion, @code_gerant, @device_gerant, @code_intervenant)
end
FETCH NEXT FROM cursor_portefeuille
INTO @code_portefeuille, @societe_gestion, @code_gerant, @device_gerant, @code_intervenant
END
CLOSE cursor_portefeuille ;
DEALLOCATE cursor_portefeuille ;
SELECT * from #finalResult
/*Don't forget to drop temp tables */
没有尝试过,我没有实际案例,但我知道逻辑有效。 但是你应该避免这样做......它运行得相当慢
【讨论】:
大家都非常喜欢泰语! ?我不明白你想说什么:) (essaie en français :P) 这是您要寻找的答案吗?如果是,请标记它!以上是关于SQL server - 仅对部分结果进行透视的主要内容,如果未能解决你的问题,请参考以下文章