복붙노트

[SQL] 동적 열 플러스 컬럼 이름 UNPIVOT

SQL

동적 열 플러스 컬럼 이름 UNPIVOT

나는 형식의 열 많은 수의 테이블을 피벗 해제하기 위해 노력하고있어 :

PID UID col1 col2 col3...

동적의 SQL은 다음과 컬럼의 이름을 제외한 거의 모든 날을 얻을 것이다. 목표는 UNPIVOT 값이 시작된 컬럼의 이름으로 "ID"필드에 기입한다.

-- Build list of cols we want to unpivot (skip PID & UID)
declare @cols nvarchar(max) 
select @cols = coalesce(@cols+N',', N'') + quotename(c.name) from syscolumns c
inner join sysobjects o on c.id = o.id and o.xtype = 'u'
where o.name = 'MyTable' and c.name not in ('PID', 'UID') order by c.colid

declare @query nvarchar(max)  

select @query = N'
select PID, [UID], ID, Val
from 
    (
    select PID, UID, ''ID'' as ID, ' + @cols + '
    from MyTable
    where UID <> 0
    ) as cp
    unpivot
    (
    Val for Vals in (' + @cols + ')
    ) as up
'
exec sp_executesql @query 

나는 어쩌면 내가 SYSCOLUMNS & MyTable에 함께 참여 일종의을하고 다음 두 번째 UNPIVOT을 할 수 있다고 생각하지만 난 그것을 알아낼 수 없었다.

궁극적으로 내 쿼리가 반환해야

PID UID ID          Val

123 456 'col1 name' 'xyz'
123 456 'col2 name' 'def'
123 333 'col1 name' 'fdf'
...

나는 UNPIVOT을위한 동적 SQL을 생성하기 위해 컬럼의 이름을 얻는 방법을 알고 동안 그래서, 나는 UNPIVOT의 출력에 열 이름을 결합하는 방법을 모르겠어요.

해결법

  1. ==============================

    1.당신은 UNPIVOT의 일부 COL의 발에서 열 이름을 참조 할 수 있습니다. 골은 열 이름을 가져옵니다

    당신은 UNPIVOT의 일부 COL의 발에서 열 이름을 참조 할 수 있습니다. 골은 열 이름을 가져옵니다

    예 바이올린

    -- Build list of cols we want to unpivot (skip PID & UID)
    declare @cols nvarchar(max) 
    select @cols = coalesce(@cols+N',', N'') + quotename(c.name) from syscolumns c
    inner join sysobjects o on c.id = o.id and o.xtype = 'u'
    where o.name = 'MyTable' and c.name not in ('PID', 'UID') order by c.colid
    
    declare @query nvarchar(max)  
    
    select @query = N'
    select PID, [UID], Col as ID, Val
    from 
        (
        select PID, UID, ' + @cols + '
        from MyTable
        where UID <> 0
        ) as cp
        unpivot
        (
        Val for Col in (' + @cols + ')
        ) as up
    '
    exec sp_executesql @query 
    
  2. from https://stackoverflow.com/questions/18775409/unpivot-with-dynamic-columns-plus-column-names by cc-by-sa and MIT license