복붙노트

[SQL] SQL Server의 동적 피벗 테이블

SQL

SQL Server의 동적 피벗 테이블

안녕하세요 다음 표를하고 난 상단에 될 수있는 EcoYear을 선회하고 싶지만 년의 설정 금액이 아니며 년은 언제든지 시작할 수 있습니다. 내가 패드 0 대신 null로 필요하므로 또한, 다른 경우는 다른 시작 연도를해야합니다.

CaseID EcoYear NetInv NetOil NetGas
38755   2006   123     2154         525 
38755   2007   123     2154         525 
38755   2008   123     2154         525 
38755   2009   123     2154         525 
38755   2010   123     2154         525 
38755   2011   123     2154         525 
38755   2012   123     2154         525 
38755   2013   123     2154         525 
38755   2014   123     2154         525 
38755   2015   123     2154         525 
38755   2016   123     2154         525 
38755   2017   123     2154         525 
38755   2018   123     2154         525 
38755   2019   123     2154         525 
38755   2020   123     2154         525 

나는이처럼 보이는 테이블이 필요합니다 :

CaseID Item 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 
38755 NetInv
38755 NetOil
38755 NetGas

이것은 원래 액세스가 크로스 탭을 사용하여 이루어졌다.

해결법

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

    1.이는 UNPIVOT 다음 PIVOT을 모두 사용하여 SQL 서버에서 수행 할 수 있습니다. 당신은 변환 할 수있는 열을 아는 경우 정적 버전은 다음과 같습니다

    이는 UNPIVOT 다음 PIVOT을 모두 사용하여 SQL 서버에서 수행 할 수 있습니다. 당신은 변환 할 수있는 열을 아는 경우 정적 버전은 다음과 같습니다

    select *
    from 
    (
      select CaseId, EcoYear, val, item
      from yourtable
      unpivot
      (
        val
        for Item in (NetInv, NetOil, NetGas)
      )u
    ) x
    pivot
    (
      max(val)
      for ecoyear in ([2006], [2007], [2008], [2009], [2010], [2011],
                     [2012], [2013], [2014], [2015], [2016], [2017],
                     [2018], [2019], [2020])
    ) p
    

    데모와 SQL 바이올린 참조

    다이내믹 버전이 실행에 레코드를 결정합니다 :

    DECLARE @colsPivot AS NVARCHAR(MAX),
        @colsUnpivot as NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(EcoYear) 
                        from yourtable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    select @colsUnpivot = stuff((select ','+quotename(C.name)
             from sys.columns as C
             where C.object_id = object_id('yourtable') and
                   C.name LIKE 'Net%'
             for xml path('')), 1, 1, '')
    
    
    set @query 
      = 'select *
          from
          (
            select caseid, ecoyear, val, col
            from yourtable
            unpivot
            (
              val
              for col in ('+ @colsunpivot +')
            ) u
          ) x1
          pivot
          (
            max(val)
            for ecoyear in ('+ @colspivot +')
          ) p'
    
    exec(@query)
    

    데모와 SQL 바이올린 참조

  2. from https://stackoverflow.com/questions/12430512/dynamic-pivot-table-in-sql-server by cc-by-sa and MIT license