2016-09-08 9 views
0

Мне нужно поместить столбцы в строки только для последних столбцов результатов моего запроса.SQL-сервер - Pivot только по части результата

Этот запрос:

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

DESIRED РЕЗУЛЬТАТ: enter image description here

Я попытался сделать это сам, но без какого-либо удовлетворительного результата.

+0

Лучше всего включить всю информацию в вопрос и избежать скриншотов. Большинство людей не захочет смотреть на них. – Tempux

+0

Возможный дубликат функции [Sql aggregate для получения списка] (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 en français: P) –

Смежные вопросы