2012-09-14 93 views
5

您好,我有以下表格,並且我希望將EcoYear轉換爲跨越頂端,但是沒有一定的年限,並且這些年份可以隨時開始。另外,不同的情況會有不同的起始年份,所以我需要它填0而不是null。
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 

這與訪問使用交叉最初完成的。

+0

簡短的回答 - 不要在SQL Server中執行此操作,而是在您用於呈現數據的任何應用程序中執行此操作。 –

+0

我的任務是在SQL Server中執行它,因爲開發人員無法在新版本中使用Access。謝謝! –

+0

搜索「動態sql」「Pivot」應該告訴你如何去做。試試看,並回來的任何問題 – podiluska

回答

14

這可以在sql server中使用UNPIVOT然後PIVOT完成。靜態版本是你知道的列轉變:

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

@RolandP它會爲您在「EcoYear」中的任何字段添加列,然後您可以根據需要限制年份。 – Taryn