2012-09-14 3 views
5

안녕하세요 다음 표가 있습니다. EcoYear를 맨 위에 놓기를 원하지만 정해진 양이 아니며 수년이 언제 시작될 수 있습니다. 또한 다른 사례의 시작 연도가 달라져서 null 대신 0을 채울 필요가 있습니다.
SQL Server의 동적 피벗 테이블

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 

이 원래 크로스 탭을 사용하여 Access를 사용하여 이루어졌다.

+0

짧은 대답을 참조 - SQL Server에서이 작업을 수행하지 마십시오. 데이터를 표시하는 데 사용하는 응용 프로그램에서 수행하십시오. –

+0

개발자가 새 버전에서 Access를 사용할 수 없기 때문에 SQL Server에서해야합니다. 감사! –

+0

"동적 SQL" "피벗"을 검색하면이를 수행하는 방법이 표시됩니다. 그것을 시도하고 어떤 문제가 다시 와서 – podiluska

답변

14

이 작업은 UNPIVOTPIVOT을 모두 사용하여 SQL Server에서 수행 할 수 있습니다.

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 Fiddle with Demo

다이내믹 버전이 실행에 레코드를 결정합니다 참조 : 당신이 열 변환을 알고 어디 정적 버전입니다

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 Fiddle with Demo

+0

감사합니다. 이것은 내가해야 할 필요가있는 것입니다. 이 동적 버전은 2006 년 이후에 시작될 수있는 다른 사례에 대한 열을 추가 할 수 있습니까? 예를 들어 2008 년에 시작했다면 2022 년으로 갈 것이지만 2006 년과 2007 년의 기둥은 0으로 표시됩니다. 그리고 당신의 도움에 감사드립니다. 나는 이것을 다른 보고서의 기초로 사용할 것입니다! –

+0

@RolandP 'EcoYear'에있는 모든 필드의 열을 추가 할 것이므로 필요에 따라 연도를 제한 할 수 있습니다. – Taryn