고그래머
67
2019-07-06 11:39:19 작성 2019-07-06 11:46:01 수정됨
6
764

[MSSQL] 테이블의 n개 행을 열로 변환하는 쿼리 질문드립니다.


안녕하세요. MSSQL 쿼리 관련해서 궁금한 게 있어서 질문 올립니다.


아래와 같이 Master 성 테이블을 가공해야 하는데 방법을 잘 모르겠습니다.

UserID가 동일한 행의 Column1, Column2에 대해서 Type별로 Select 테이블의 열로 변환을 해야하는데 쿼리를 어떻게 짜야할지 전혀 모르겠습니다...


[Master Table] 

[Select Table]


pivot도 생각해봤는데, 이건 단순하게 행을 열로 변환해주는 기능같아서 다른 방법도 있나 여쭤봅니다.

해당 결과를 Linq로 작성해야하는데, 일단 MSSQL 쿼리부터 한 번 짜보고 생각해보려고 합니다..

구글에 검색하려고 해도, 어떤 키워드로 검색해야할지 몰라서.. 키워드라도 던져주시면 감사하겠습니다.


OKKY 선배님들 도움 부탁드립니다.

0
0
  • 답변 6

  • 더미
    14k
    2019-07-06 13:06:06

    동적으로 피벗하는겁니다.

    0
  • 이카로스
    216
    2019-07-06 13:42:16 작성 2019-07-06 13:42:30 수정됨
    0
  • ik7122
    625
    2019-07-08 11:08:39

    --CREATE TABLE mTbl

    --(

    -- USERID VARCHAR(30)

    -- ,TYPE VARCHAR(30)

    -- ,COLUMN1 VARCHAR(50)

    -- ,COLUMN2 VARCHAR(50)

    --)


    --INSERT INTO mTbl

    --VALUES ('1','AA','A1-1','A1-2')

    --   ,('1','BB','A2-1','A2-2')

    --   ,('2','AA','B1-1','B1-2')

    --   ,('2','CC','B2-1','B2-2')

    --   ,('2','DD','B3-1','B3-2')

    --   ,('3','BB','C1-1','C1-2')


    --SELECT 

    -- *

    --FROM mTBL A


    -- 1번째

    SELECT

    *

    FROM

    (

    SELECT 

    USERID

    ,[TYPE] + '_' + [ColList] AS ColList

    ,[DATA] AS DataList

    FROM mTBL A WITH(NOLOCK)

    UNPIVOT

    (

    [DATA] FOR [ColList] IN ([COLUMN1],[COLUMN2])

    ) UPV

    ) A

    PIVOT

    (

    MAX(DataList) FOR ColList IN ([AA_COLUMN1],[AA_COLUMN2],[BB_COLUMN1],[BB_COLUMN2],[CC_COLUMN1],[CC_COLUMN2],[DD_COLUMN1],[DD_COLUMN2])

    ) PV


    -- 2번째

    DECLARE @query NVARCHAR(MAX) = ''

    DECLARE @colList NVARCHAR(MAX) = ''


    SELECT

    @colList += ',' + QUOTENAME(COL)

    FROM

    (

    SELECT DISTINCT [TYPE] + '_COLUMN1' AS COL FROM mTbl WITH(NOLOCK)

    UNION ALL 

    SELECT DISTINCT [TYPE] + '_COLUMN2' AS COL FROM mTbl WITH(NOLOCK)

    ) A

    ORDER BY COL


    SELECT @colList = STUFF( @colList,1,1,'')


    SET @query = N''

    + ' SELECT '

    + ' * '

    + ' FROM '

    + ' ( '

    + ' SELECT  '

    + ' USERID '

    + ' ,[TYPE] + ''_'' + [ColList] AS ColList '

    + ' ,[DATA] AS DataList '

    + ' FROM mTBL A WITH(NOLOCK) '

    + ' UNPIVOT '

    + ' ( '

    + ' [DATA] FOR [ColList] IN ([COLUMN1],[COLUMN2]) '

    + ' ) UPV '

    + ' ) A '

    + ' PIVOT '

    + ' ( '

    + ' MAX(DataList) FOR ColList IN (' + @colList + ') '

    + ' ) PV '


    EXEC SP_EXECUTESQL @query

    0
  • ik7122
    625
    2019-07-08 11:09:53

    첫번째는 위에 주어진 조건으로만 unpivot 후 다시 pivot

    두번째는 위에 주어진 조건 이외에 TYPE이 더 있을 때.. 동적으로 

    만약 Column1,Column2 값도 더 있다면 먼저 조회를 해서 변수에 담은 후

    동적 쿼리로 만드시면 될 거 같아요

    0
  • ik7122
    625
    2019-07-08 11:10:53


    0
  • 고그래머
    67
    2019-07-08 20:38:21

    더미 감사합니다. 동적 Pivot 키워드로 찾아보니 참고글이 많아서 도움 많이 됐습니다!

    이카로스 링크 감사합니다 :) 일단 pivot으로 쿼리짜긴 했는데, linq로 해보고 힘들면 알려주신 방법도 활용해보려구요.

    ik7122 우왕 쿼리랑 결과까지 정말 감사합니다! unpivot을 몰라서 pivot 테이블 2개 만들어서 조인했는데 답변보고 다시 한 번 쿼리 수정해야겠어요! 도움 주셔서 감사합니다 :)

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.