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 - 仅对部分结果进行透视的主要内容,如果未能解决你的问题,请参考以下文章

按年份透视 SQL Server 结果

带有计数和总和的 SQL Server 数据透视表

SQL Server 基于集合的 while 循环避免万圣节保护 (LAHP) 用于层次结构透视将某些结果减半

SQL Server 中的数据透视表查询

使用数据透视/转置的 SQL Server

SQL Server 2008 R2 将一行结果拆分为两行