2016-09-08 5 views
0

クエリの結果の最後の列にのみ列を配置する必要があります。SQLサーバー - 結果の一部のみをピボットする

クエリは次のとおりです。

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 

結果: enter image description here

望ましい結果: enter image description here

私はそれを自分自身を実行しようとしましたが、任意の満足のいく結果なしています。

+0

質問自体にすべての情報を含め、スクリーンショットを避ける方が良いです。ほとんどの人は見て気にしません。 – Tempux

+0

[SQL集計関数の可能な複製]リストを取得する(http://stackoverflow.com/questions/9358691/sql-aggregate-function-to-obtain-a-list) – Stivan

+0

動的SQLは私が提案したもの –

答えて

-2

EDIT

私はこれを行う簡単な方法が表示されません。 実際の結果は、この例では#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 */ 

この表にデータを挿入する必要があり、それをしようとしなかった、私は到達で実際のケースを持っていませんが、私は、ロジック作品を知っています。 しかし、これを避けるべきです...かなりゆっくり実行されます

+0

誰かが低い投票をした理由を誰かに説明できますか? –

+0

タイはあなた一人一人にたくさん! – rainer

+0

?私はあなたが言っていることを理解していません:)(essaie enfrançais:P) –